Autor Zpráva
anonymníí
Profil *
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
Tento dotaz vrací počet záznamů z tabulky 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
2x left join a ve where testovat, že oba klíče z těch tabulek nejsou null
Kajman
Profil
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.

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: