Autor Zpráva
quatzael
Profil
Mám dvě tabulky.
V tabulce A jsou sloupce:
id,
user_id,
status

A v tabulce B:
subject_id
a další

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
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
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
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
Aha, funguje to. Nějak jsem to těma podmínkama vyfiltroval až moc..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: