Autor | Zpráva | ||
---|---|---|---|
quatzael Profil |
Mám dvě tabulky.
V tabulce A jsou sloupce: id, user_id, status A v tabulce B: subject_id Potřeboval bych získat záznamy z tabulky B, v závislosti na podmínkách, které se týkají tabulky A: user_id = $user_id AND status = 'on' a z tohoto vytříděného vzorku z tabulky A bych potřeboval získat záznamy všech sloupců z tabulky B kde: A.id = B.subject_id a dále za podmínek, které se týkají už jenom čistě tabulky B: B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' Napadl mě tento zápis, ale nevím jestli je to správně a jestli se na to dá sto pro spolehnout. Hlavně mi moc nejsou jasný ty rozdíly INNER JOIN a OUTER JOIN a rozdíl mezi ON a WHERE.. SELECT B.* FROM A RIGHT JOIN B ON A.user_id=$user_id AND A.status='on' AND A.id=B.subject_id WHERE B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' Ještě doopravím, že mě vlastně spíš zajímá počet takových výsledků. Takže by to asi mělo vypadat nějak takhle: SELECT COUNT(B.*) FROM A RIGHT JOIN B ON A.user_id=$user_id AND A.status='on' AND A.id=B.subject_id WHERE B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' |
||
Zechy Profil |
OUTER JOIN v závislosti na tom, zda je RIGHT(= tabulka, která je ve FROM), LEFT(= tabulka, která je v JOIN) nebo FULL vybírá i sloupce, které spojovací podmínce neodpovídají. Pokud bychom měli zaměstnance a oddělení, tak RIGHT OUTER JOIN by vypsal i zaměstnance, co oddělení nemají a LEFT OUTER JOIN by vypsal i oddělení, co nemají zaměstnance. FULL by vypsal obojí dohromady.
Co se týče ON(), jedná se o spojovací podmínku, pomocí ON(table1.column1 = table2.column2) se určuje, dle kterých sloupců se mají tabulky spojit. Pokud zůstaneme u předchozího příkladu, dá se tak určit, že tabulku zaměstnanci a oddělení chceme spojit pomocí sloupce oddělení_id v tabulce zaměstnanci a sloupce id v tabulce oddělení. ON() by se měl využívat jenom v případě, že sloupce si neodpovídají ani názvem, ani datovým typem. Pokud si neodpovídají pouze datovým typem měl by se používat USING(), a pokud si sloupce odpovídají datovým typem i názvem, stačí do dotazu napsat jenom JOIN table. |
||
quatzael Profil |
Zechy:
„OUTER JOIN v závislosti na tom, zda je RIGHT(= tabulka, která je ve FROM), LEFT(= tabulka, která je v JOIN)“ Jseš si jistej tím RIGHT a LEFT? Není to náhodou naopak? Nebo jsem to z tý věty nějak špatně pochopil.. Tady každopádně píšou něco jinýho: www.sql-tutorial.net Můžeš to prosím vysvětlit přímo na tom mým příkladu, tedy s tabulkma A a B? Já chci získat data z tabulky B. Data z tabulky A mě primárně nijak nezajímají. Jenom potřebuju, aby vypsal jen ty data, který jednak vycházejí z podmínek z první tabulky a potom i z druhý: Prostě z první tabulky A si potřebuju vytřídit vzorek záznamů, kde: A.user_id = $user_id AND A.status = 'on' Z toho by se měl vygenerovat seznam záznamů, ale já potřebuju jen sloupec s id a podle těchhle id-éček vyhledat záznamy z tabulky B, tedy: A.id = B.subject_id a tenhle vygenerovanej seznam z tabulky B už jen profiltrovat omezujícími podmínkami: B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' |
||
Zechy Profil |
quatzael:
Je možný, že jsem to otočil. Pokud potřebuješ dostat data z první tabulky v závislosti na datech z druhé tabulky, dej tudle podmínku do join - A.id = B.subject_id, dle toho se vyberou data z obou tabulek. Zbytek už si ovlivníš ve where. |
||
quatzael Profil |
#5 · Zasláno: 10. 5. 2014, 13:53:25
Zechy:
Tak může to být teda takhle? SELECT COUNT(B.*) FROM A RIGHT JOIN B ON A.user_id=$user_id AND A.status='on' AND A.id=B.subject_id WHERE B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' |
||
Zechy Profil |
#6 · Zasláno: 10. 5. 2014, 14:10:03
Takže takhle:
SELECT COUNT(B.*) FROM A RIGHT JOIN B ON(A.id=B.subject_id) WHERE B.column1 = 'bla' AND B.column2 = 'bla bla' AND B.column3 = 'bla bla bla' AND A.user_id=$user_id AND A.status='on' |
||
quatzael Profil |
#7 · Zasláno: 11. 5. 2014, 01:15:41
Zechy:
Mě to ale nefunguje. Když to normálně zkouším v PHP tak to háže hodnotu NULL, ale jako chybu to nic nehlásí. Přímo v phpMyAdmin to ale vyhazuje tohle: #1046 - No database selected |
||
quatzael Profil |
#8 · Zasláno: 11. 5. 2014, 17:35:44
Aha, funguje to. Nějak jsem to těma podmínkama vyfiltroval až moc..
|
||
Časová prodleva: 11 let
|
0