PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
Zdravím, zkouším si hrát s PostgreSQL a narazil jsem na jeden problém v dotazu, který si nejsem schopný vysvětlit:
SELECT c.*, count(o."orderNumber") AS orders
FROM "Customers" AS c
LEFT JOIN "Orders" AS o ON c."customerNumber" = o."customerNumber"
GROUP BY c."customerNumber"
ERROR: column "c.customerName" must appear in the GROUP BY clause or be
used in an aggregate function
Chyba je na řádku 1, znak 8. Očividně mu vadí c.*,
protože když ho nahradím za nějaký konkrétní atribut, dotaz projde.
Přidat c.customerName za GROUP BY taky nepomůže,
protože pak dotaz skončí na té samé chybě ale v chybovém hlášení se
objeví následující atribut tabulky… Nechápu ale proč chce, abych ho
obalil agregační funkcí.
Existuje nějaký způsob jak rozjet tento dotaz, aniž bych musel ručne
vypsat do selectu všechny atributy tabulky Customers?
Offline
Pokud chceš použít skupinovou funkci, tak musíš vyjmenovat slopce, dle kterých se mají hodnoty počítat.
Mělo by se to dát obejít nějak takhle:
SELECT c.*,
(SELECT COUNT(1)
FROM "Orders" AS o
WHERE c."customerNumber" = o."customerNumber") AS orders_count
FROM "Customers" AS c
Offline
no když se nad tím dotazem zamyslíš, tak ti musí dojít, že je to vlastně hloupost, ne? všechny sloupce, který chceš vybrat (kromě těch v agregačních funkcích) musíš dát taky do group by. jak by databáze mohla vědět, jakou hodnotu ti má vrátit např. v tom customerName, když bude groupovat podle něčeho jinýho. tohle povoluje snad akorát mysql (myslím) a pak tam vrací samozřejmě nějaký data, jak se jí to hodí (což je špatně), vůbec se nemůžeš spolehnout, co dostaneš.
zamysli se nad tímhle (zjednodušeně)
id,customerName,customerNumber 1,karel,10 2,petr,10
dáš-li group by customerNumber, dostaneš jen jeden řádek, ale co by mělo obsahovat customerName?
Editoval Kevujin (30. 10. 2009 12:14)
Offline
MySQL vraci pri GROUP prvni radek. Jde se na to spolehnout pokud vis jak data radis (coz vis zcela jiste kdyz pouzijes ORDER).
Timto se da vyresit problem u MySQL. Protoze napr kdyz pocitas pocet produktu v kategorii je vhodnejsi vylistovat kategorie, joinout produkty, a groupnout dle idCategory. A nemusim se v group vypisovat se vsemi parametry tabulky kategorie. Je dokonce mozne ziskat prvni produkt z kategorie i kdyz nevim k cemu by to bylo vhodne.
Druhe reseni co se nabizi je vylistovat kategorie a ke kazdy kategorii udelat subdotaz na pocet produktu kategorie. Zde MySQL provede 1+N dotazu kde N je pocet kategorii. Coz muze byt casove dost narocne oproti jednomu slozitejsimu dotazu. Vyuziti indexu zde je skoro indenticke takze rozdil je pouze v poctech dotazu.
Offline
OK, díky za odpovědi, je fajn vědět, že toto fórum ještě někdo čte ;)
Kevujin: v tom případě co jsem psal nahoře je o.orderNumber
a c.customerNumber primárním klíčem, takže je tam zaručena
unikátnost a takový případ, že by nevěděl co vybrat nenastane.
Offline