Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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:

[http://pc.poradna.net/file/view/13954-address-book -png]

Tabulka bulletin_register

[http://pc.poradna.net/file/view/13955-bulletin-reg istr-png]

Tabulka Obsah:

[http://pc.poradna.net/file/view/13953-obsah-png]

Předmět Autor Datum
V dotazu máš přehozené WHERE a AND
Banshee 10.05.2013 14:08
Banshee
Stačí: SELECT entry_state, address_book_id AS address_book_id, entry_company AS entry_company, p.id…
Flash_Gordon 10.05.2013 14:14
Flash_Gordon
:-) Jsem SQL odkojen, takže jsem to dočetl, přesto moc nepochopil. Nicméně k chybě: MySQL hlásí: #1…
AZOR 11.05.2013 03:44
AZOR
bulletin_registr Uplně přesně nevím co logicky má být v téhle tbl a jaký má logický vztah k ostatní… poslední
AZOR 11.05.2013 03:48
AZOR

Stačí:

SELECT entry_state, address_book_id AS address_book_id, entry_company AS entry_company, p.id_adresy, p.id_skupiny checkbox_checked, 'address_book'
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
UNION Select email , '', '','','', 'bulletin_registr' from bulletin_registr where email NOT LIKE ' ' Group by email

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ě:

MySQL hlásí:
#1221 - Incorrect usage of UNION and ORDER BY

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.

Zpět do poradny Odpovědět na původní otázku Nahoru