Autor | Zpráva | ||
---|---|---|---|
anonymníí Profil * |
#1 · Zasláno: 18. 12. 2015, 17:04:28
Ahoj,
potřeboval bych poradit s SQL dotazem, který mi zjoinuje data buď z jedné tabulky, nebo z druhé, nebo obou. Použití LEFT JOIN ů asi cesta nebude, to by prošly i záznamy, které nejsou ani v jedné z těch joinovaných tabulek.
Struktura je takováto: Tabulka p (id, status, ...) Tabulka ph (p_id, h_id, ...) Tabulka h (id, h, h_id, ...) Můj současný dotaz zní: SELECT COUNT(DISTINCT(p.id)) AS count FROM p JOIN ph ON ph.p_id = p.id JOIN h ON ph.h_id = h.id AND LEFT(h.h, LENGTH('" . $var . "')) = '" . $var . "' -- k tomuto pak bude druhý dotaz pod čarou WHERE p.status = 1 p , které mají záznam v tabulce h a jejichž h.h začínám nějakým řetězcem. Funguje dobře.
Nyní mám ale navíc tabulku c (p_id, h_id) , kterou bych potřeboval přidat do předchozího dotazu, ale nevím jak.
Pokud to popíšu slovně, mělo by to dělat následující: Vyber počet z tabulky p připoj tabulku ph na základě ph.p_id = p.id ( (připoj tabulku h na základě ph.h_id = h.id AND LEFT(...) = ...) NEBO připoj tabulku c na základě c.h_id = h.id -- toto potrebuji pridat ) kde p.status = 1 Poradíte? Děkuji. Poznámka pod čarou: V současném dotazu jsem označil místo, které vím, že není řešení ideálně, ale nevím, jak jej případně řešit lépe. Představme si, že to jsou třeba kategorie. Tabulka Kategorie (id, nazev, nadrazena, pozice, ...)
Data mohou být: 1 | ... | -1 | 0001 | ... 2 | ... | 1 | 0001.0001 | ... 3 | ... | 2 | 0001.0001.0001 | ... 4 | ... | 2 | 0001.0001.0002 | ... 5 | ... | 2 | 0001.0001.0003 | ... 6 | ... | 5 | 0001.0001.0003.0001 | ... ... Představme si, že jsem v kategorii 2 a potřebuji vypsat všechny události, které do ní spadají, včetně vnořených (tedy z kategorií 2-6). Já vyberu všechny, které mají pozici začínající na 0001.0001 , čímž výsledku dosáhnu. Ale není to elegantní, ani nevím, jak s tím naložit lépe. Počet úrovní není omezen. Ideálně by dotaz asi vypadal ... WHERE id IN (2, 3, 4, 5, 6) , ale jak toho dosáhnout? Nějakých subdotazem? Druhým dotazem položeným před tímto? Jinak?
Děkuji. |
||
Kajman Profil |
#2 · Zasláno: 18. 12. 2015, 18:47:51
2x left join a ve where testovat, že oba klíče z těch tabulek nejsou null
|
||
Kajman Profil |
#3 · Zasláno: 19. 12. 2015, 18:16:00
A k poznámce pod čarou, pokud používáte databázi bez nativni podpory hiearchických dotazů (např. mysql je neumí), mrkněte na traverzování kolem stromu.
|
||
Časová prodleva: 8 let
|
0