Pokročilejší SQL dotaz
Ahoj. Mám tři tabulky.
První se jmenuje adress_book
druhá se jmenuje skupina_hlavni
a třetí se jmenuje skupina_obsah
První tabulka obsahuje emaily.
druhá obsahuje seznam zákaznických skupin
a třetí definuje, které emaily patří do jaké skupiny.
A já mám uloženo několik skupin v skupina_hlavní a v skupina_obsah mám již několik ID adres.
A nyní co zjednodušeně chci:
Chci, aby pokud je ve vybrané skupině (v skupina_obsah) nalezeno ID shodné v adress_book, aby měl nenulovou hodnotu sloupec checkbox_checked.
Zjednoduším to zadáním: Pokud edituji konkrétní zákaznickou skupinu, můžu si vybírat z tabulky adress_book všechny příjemce a přiřazovat je do této skupiny.
A v uživatelském rozhraní se zobrazuje u seznamu VŠECH adres checkbox, který je zaškrknutý v případě, že je email ve skupině. Opravdu jednoduché, ale jak na to?
Dopracoval jsem se k následujícímu dotazu:
SELECT entry_state, address_book_id as address_book_id, entry_company as entry_company, p.id_adresy checkbox_checked
FROM address_book LEFT JOIN skupina_obsah p ON p.id_adresy = address_book_id WHERE entry_state NOT LIKE ' ' and p.id_skupiny = 6 group by entry_state ORDER BY entry_company");
Tento dotaz má však tu zásadní chybu, a to ,že vybírá jen obsažené (checked) adresy.
Jak ho mám přepsat, aby vypisoval všechny adresy z adress_book a ty, které jsou zároveň obsaženy v skupina_obsah.id_adresy , aby měly sloupec checkbox_checked nenulový?
Co třeba
Nevím, jestli si rozumíme.
Já chci jednoduše vytáhnout VŠECHNY adresy z adress_book s tím, že když budou v skupina_obsah (o konkrétním id), tak bude v sloupečku checkbox_checked nenulová hodnota.
Podle manualu coalesce vrací pouze jedinou hodnotu a tak nevím, jak by mi v tom mohla být nápomocna.
Pokud použiješ left join a zároveň omezující podmínku na připojenou tabulku, tak je to prakticky stejné jako outer join, tedy nemáš ve výsledku všechny řádky z první tabulky. Použití coalesce tenhle problém odstraní.
Děkuji. Funguje.
Pro případ, že by někdo řešil podobnou hádanku dávám celé řešení:
SELECT entry_state, address_book_id as address_book_id, entry_company as entry_company, p.id_adresy checkbox_checked
FROM address_book LEFT JOIN skupina_obsah p ON p.id_adresy = address_book_id WHERE entry_state NOT LIKE ' ' and coalesce(p.id_skupiny, 5) = 5 group by entry_state ORDER BY entry_company
neni nazev tématA "Pokročilejší dotaz?" - timto se odkazuji na aplikaci Siebel, která do DB spouští sql generované dotazy, kde si tabulky vždy označí aliasem T<cislo_tabulky> tzn T1, T2, T3.. a uz jsem videl selecty s T273 aliasem..
mimochodem NOT LIKE '' nedává smysl.