Programátorský problém + MySQL problém
Zdar.
Mám tady menší oříšek a zajímaly by mě nápady na úrovni SQL i programátorské.
Uvažujme tabulku address_book a tabulku bulletin_registr.
Původní řešení počítalo jen s tabulkou address_book. Tabulka bulletin_registr je nová a zatím je "mimo systém".
Tabulky obsahují sloupec s emaily uživatelů.
A teď....
Existuje třetí tabulka skupina_obsah, která obsahuje vazby mezi tabulkami ID - address_book a ID - skupiny.
Toto umožňuje ve výsledku vytvářet skupiny příjemců, které obsahuje daná skupina (skupina má identické ID).
Ano... je to těžší na pochopení, ale kdyby to bylo jednoduché, nedával bych vám to.
Takže dotaz, který vytvořil skupinu příjemců vypadal nějak takto:
INSERT INTO skupina_obsah (id_skupiny,id_adresy) VALUES (12,14)
A já teď řeším oříšek, jak rozšířit s minimem změn tento zápis tak, abych do toho mohl zařadit i tabulku bulletin_registr.
Zatím mě po poradě napadlo rozšířit tabulku skupina_obsah o další sloupec, který by nesl název tabulky (zda jde o address_book či bulletin_registr).
Nyní tedy tvořím dotaz, který vytáhne z obou tabulek unikátní emaily.
Původní dotaz vypadal takto:
SELECT entry_state, address_book_id AS address_book_id, entry_company AS entry_company, p.id_adresy, p.id_skupiny checkbox_checked
FROM address_book
LEFT JOIN skupina_obsah p ON p.id_adresy = address_book.address_book_id
AND id_skupiny = 14
WHERE entry_state NOT LIKE ' ' group by entry_state ORDER BY entry_company
A ten se pokouším rozšířit o sloupec z druhé tabulky bulletin_registr, který se jmenuje email.
Zkusil jsem toto:
SQL-dotaz:
SELECT entry_state, address_book_id AS address_book_id, entry_company AS entry_company, p.id_adresy, p.id_skupiny checkbox_checked, 1
FROM address_book
LEFT JOIN skupina_obsah p ON p.id_adresy = address_book.address_book_id
AND id_skupiny =14
WHERE entry_state NOT LIKE ' '
GROUP BY entry_state
ORDER BY entry_company
UNION SELECT email, '', '', '', '', 2
FROM bulletin_registr
LIMIT 0 , 30
MySQL hlásí:
#1221 - Incorrect usage of UNION and ORDER BY
Dočetli jste to až sem? Gratuluji.
Ale vděčný budu za řešení.
Tabulka Address_book:
Tabulka bulletin_register
Tabulka Obsah:
V dotazu máš přehozené WHERE a AND
Stačí:
Niceméně
Jsem otevřen návrhům.
Jsem SQL odkojen, takže jsem to dočetl, přesto moc nepochopil. Nicméně k chybě:
Nevim jak MYSQL ale ORACLE umožňuje ORDER BY pouze v POSLEDNÍM selectu, který je v UNIONU, neb UNION znamená spojit výsledky všech selectu v UNION (a nemusi byt jen dva) a proto logicky ORDER BY nemůže být u každého, konvenčně je to pak dáno u toho posledního. (otázka je jestli je to třeba - UNION znamená SORT interně pro databázi a implicitně je to ASC seřazeno podle všech sloupcu, když to vypadne z UNION operace)
Ten puvodni dotaz jsem moc nepochopil ;)
Nicméně v tabulce pochopitelně mužou být hodnoty typu (1,2,tabulka_pro_kterou_je2) a (1,22,tabulka_pro_kterou_je23), pokud je to pro aplikaci výhodné - a neviděl bych to prvně. Viz S_PARTY tabulka Sieblu.
Uplně přesně nevím co logicky má být v téhle tbl a jaký má logický vztah k ostatním, to se přiznám jsem vůbec nepochopil. Logický ve smyslu - muže to být pouze tady v případě, že není musí být v bulletin_registr atd.