Podmíněné připojení dvou tabulek najednou
- Filip Procházka
- Moderator | 4668
Zdravím, potřeboval bych připojit dvě tabulky zároveň a to pouze pokud bude podmínka platit na obě
původně jsem tam měl
LEFT JOIN [:tts:seasons_members] AS sm USING([team_id])
LEFT JOIN [:tts:seasons] AS s ON ( sm.[seasone_id]=s.[seasone_id] AND s.[date_newplayers]<NOW() AND s.[date_end]>NOW() ),
což by se dalo použít, ale je problém že by mi to vracelo řádky které nechci vypisovat
IMHO nejlíp co potřebuju jde pochopit na
LEFT JOIN [:tts:seasons_members] AS sm, [:tts:seasons] AS s
ON ( sm.[seasone_id]=s.[seasone_id] AND s.[date_newplayers]<NOW() AND s.[date_end]>NOW() AND sm.[team_id]=t.[team_id])
Tady je celý dotaz jak je teď, samozřejmě nefunguje (You have an error in your SQL syntax)
-- vyberu co potřebuju
SELECT t.*, g.[name] AS [game], s.[name] AS [seasone],
i.[name] AS [logo], f.[name] AS [flag], l.[username], sm.[status] AS [mstatus]
FROM [:tts:teams] AS t
-- připojím informace o uživateli
INNER JOIN [:tts:teams_members] AS m USING([team_id])
INNER JOIN [:gsk:user] AS l ON l.[id] = t.[leader]
INNER JOIN [:mod:imanager_images] AS f ON t.[flag] = f.[id]
-- tady nastává problém
LEFT JOIN [:tts:seasons_members] AS sm, [:tts:seasons] AS s
ON ( sm.[seasone_id]=s.[seasone_id] AND s.[date_newplayers]<NOW() AND s.[date_end]>NOW() AND sm.[team_id]=t.[team_id])
-- připojím informace o hře
LEFT JOIN [:tts:games] AS g ON s.[game_id] = g.[id]
LEFT JOIN [:mod:imanager_images] AS i ON g.[image] = i.[id]
WHERE m.[user_id]=%i",$user['id']," AND m.[approved]=1 AND t.[status]!='wiped'
GROUP BY t.[team_id],s.[seasone_id]
ORDER BY t.[team_name] ASC
Editoval HosipLan (17. 2. 2010 10:25)
- Mikulas Dite
- Člen | 756
A nestačilo by do JOIN dát spojení nad klíčem a ověřovat ty podmínky
normálně ve WHERE?
Tedy:
LEFT JOIN [:tts:seasons_members] AS sm
sm.[team_id]=t.[team_id]
LEFT JOIN [:tts:seasons] AS s
ON sm.[seasone_id]=s.[seasone_id]
WHERE m.[user_id]=%i",$user['id']," AND m.[approved]=1 AND
t.[status]!='wiped' AND
s.[date_newplayers]<NOW() AND
s.[date_end]>NOW() AND sm.[team_id]=t.[team_id])
Editoval Mikulas Dite (17. 2. 2010 10:58)
- Filip Procházka
- Moderator | 4668
Bohužel tohle nejde, nemohl bych vypsat řádky tabulky s týmy, zkoušel jsem :(
- Mikulas Dite
- Člen | 756
Ale vždyť v selectu je FROM [:tts:teams] AS t, tým sice bude u každé řádky, ale s tím se dá pracovat v php.
- Filip Procházka
- Moderator | 4668
Ale jde o to že pokud tam například nebude žádný registrovaný turnaj
tak se mi ten team nemá odkud vzít protože neprojde podmínka. Nevím co
dělám špatně ale pokud se ta podmínka týká tabulky připojené pomocí
LEFT JOIN
tak se to chová jako INNER
, teď si ani
nejsem jistej jestli je to feature nebo chyba u mě. Ale chová se to tak,
proto nebude odkud vzít tým protože nezískám ten záznam s připojením do
turnaje :(
- Mikulas Dite
- Člen | 756
Už to chápu. Co mi ale není jasné je sjednocení do jedné query. I co do optimalizace by bylo vhodnější (v patřičném modelu) mít funkce getTeams() a getTournaments(), protože IMHO není potřeba mít na db jenom jeden dotaz. Každopádně tvému zadání by měl vyhovovat LEFT OUTER JOIN http://dev.mysql.com/…en/join.html.