Podmíněné připojení dvou tabulek najednou

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

Bohužel tohle nejde, nemohl bych vypsat řádky tabulky s týmy, zkoušel jsem :(

http://i50.tinypic.com/2yya8ft.jpg

Mikulas Dite
Člen | 756
+
0
-

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
+
0
-

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
+
0
-

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.