Zadejte hledaný výraz...

Složitější dotaz na relaci N:N

3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 10:53:08
Zdravím,
mám tabulku realizující vztah N:N. Tabulka s daty:
A l B
1 l 20
1 l 30
2 l 30
3 l 20
3 l 30
3 l 40
Chci vytáhnout všechny indexy z A, pro které existuje ve sloupci B záznam 20 a
30. Tzn.: Pro tuto tabulku by výsledek vrátil 1 a 3.
Praktický příklad použití: Řekněme, že chci třeba vytáhnout všechny uživatele, kteří si koupili obě knihy "Bible" a "Korán".
Lze to udělat jedním dotazem? (vnořené sql dotazy mě napadly, ale pokud bude hledných knih třeba 10, je to nesmysl)
6. 12. 2013 10:53:08
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973707
Dáš dotaz na "propojovací" tabulku jestli existuje propojeni s indexem na 20 a 30 a máš hotovo na jeden dotaz ... SQL ti nenapíšu protože od doby co používám ORM tak jsem k němu nepáchl :-)
6. 12. 2013 10:58:58
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973706
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 11:05:15
Tak mi napiš prosím, jak bys to udělal pomocí ORM, třeba mi to pomůže. (protože "dáš dotaz a máš hotovo" mi moc nepomáhá)
6. 12. 2013 11:05:15
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973705
solarinfo
verified
rating uzivatele
6. 12. 2013 11:06:26
SELECT A FROM table WHERE B IN (20,30)
EDIT:
pokud k tomu potrebujes jeste data z tabulky uzivatel, tak jeste pridat join, mohlo by to vypadat zhruba takto:
SELECT * FROM uzivatel u JOIN spojovaci_tabulka st ON (u.A = st.A) WHERE st.B IN(20,30)
6. 12. 2013 11:06:26
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973704
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 11:11:47
Napsal solarinfo;1030220
SELECT A FROM table WHERE B IN (20,30)
Toto právě vrací i indexy, které obsahují pouze jednu položku z výčtu. Pro uvedený příklad tedy i index 2 (obsahuje 30, ale neobsahuje 20, tedy jej nehledáme).
6. 12. 2013 11:11:47
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973703
qwertr
verified
rating uzivatele
(7 hodnocení)
6. 12. 2013 11:17:00
Takze prva vec. Neviem aku maz strukturu. Predpokladajme, ze maz korektne navrnutu vezbu M:N a to takto
tabulkaM ------> tabulkaVezbaMN <----- TabulkaN
potom select by mohol vyzerat takto
6. 12. 2013 11:17:00
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973702
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 11:39:19
Asi to vysvětluji pořád blbě. V příloze zasílám strukturu ukázkové databáze. (9436)
Cíl zní: Zjisti ID všech čtenářů, kteří si vypůjčili Bibli a Korán (tzn. obě dvě, ne jen jednu z nich).
Správná odpověď: 1 (Karel) a 3 (Jana). Nikoliv 2 (Pepík), protože ten si vypůjčil pouze Bibli.
6. 12. 2013 11:39:19
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973701
qwertr
verified
rating uzivatele
(7 hodnocení)
6. 12. 2013 11:54:30
Pochopil som ta, ked som to dopisla.
Potrebujes urobit namiesto IN (20, 30) co predtavuje 20 or 30 nieco vo vyzname 20 and 30.
Vytiahni mi tych zakaznikov, ktory si objednali sucasne aj 20 aj 30.
6. 12. 2013 11:54:30
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973700
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
6. 12. 2013 12:00:56
mě napadla taková haluz :)
select distinct(A) from table where B IN (30,20) group by A having Count(B) > 1
6. 12. 2013 12:00:56
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973699
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 12:13:27
Napsal qwertr;1030245
Potrebujes urobit namiesto IN (20, 30) co predtavuje 20 or 30 nieco vo vyzname 20 and 30. Vytiahni mi tych zakaznikov, ktory si objednali sucasne aj 20 aj 30.
Přesně.
Napsal Bedříšek;1030247
select distinct(A) from table where B IN (30,20) group by A having Count(B) > 1
Jojo :D tohle je dobrý, akorát nemůžeš specifikovat konkrétní hodnoty pro to B no :)
6. 12. 2013 12:13:27
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973698
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
6. 12. 2013 12:18:09
Napsal 3CK;1030250
Přesně.
Jojo :D tohle je dobrý, akorát nemůžeš specifikovat konkrétní hodnoty pro to B no :)
můžeš. where B IN (30,20) a count bude vždy o jednu méně hodnot než požadovaných
6. 12. 2013 12:18:09
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973697
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 12:20:55
Napsal Bedříšek;1030252
můžeš. where B IN (30,20) a count bude vždy o jednu méně hodnot než požadovaných
No jo. Já to přehlídl. Tak v tom případě jo! Do elegantnosti to má teda daleko, ale můj účel to splní! Dík!
6. 12. 2013 12:20:55
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973696
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
6. 12. 2013 12:22:14
nebo dej having count(B) = 2 a jde o přesný počet. takže pokud zadáš hodnot např. 5, tak having count(B) = 5
6. 12. 2013 12:22:14
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973695
Další řešení, INNER JOIN tabulky na sebe samou.
http://sqlfiddle.com/#!2/c9b4b/1
6. 12. 2013 13:45:40
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973694
3CK
verified
rating uzivatele
(2 hodnocení)
6. 12. 2013 14:01:03
Napsal Martin Schlemmer;1030294
Další řešení, INNER JOIN tabulky na sebe samou.
Funguje taky, ale přijde mi to na stejné úrovni jako varianta s vnořenými selecty: Když bude hledaných knih/produktů/etc třeba 10, vzniká z toho hrozný paskvil. O efektivnosti nemluvě. Ale taky dík!
Varianta od Bedříšek mi přijde pěkná - lze pak psát jednoduše třeba:
$id = Array(10, 20, 60, 80, 90, 100);
dibi::query('SELECT DISTINCT FROM WHERE IN (%i) GROUP BY HAVING COUNT() = %i', $id, count($id));
6. 12. 2013 14:01:03
https://webtrh.cz/diskuse/slozitejsi-dotaz-na-relaci-nn#reply973693
Pro odpověď se přihlašte.
Přihlásit