Ich habe einige meiner MySQL-Abfragen nach PostgreSQL migriert, um Heroku zu verwenden. Die meisten meiner Abfragen funktionieren einwandfrei, aber ich habe immer wieder einen ähnlichen wiederkehrenden Fehler, wenn ich group by verwende:
FEHLER: Die Spalte "XYZ" muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
Könnte mir jemand sagen, was ich falsch mache?
MySQL, das zu 100% funktioniert:
SELECT `availables`.*
FROM `availables`
INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id
WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24')
GROUP BY availables.bookdate
ORDER BY availables.updated_at
PostgreSQL-Fehler:
ActiveRecord :: StatementInvalid: PGError: ERROR: Die Spalte "Availables.id" muss in der GROUP BY-Klausel enthalten sein oder in einer Aggregatfunktion verwendet werden:
SELECT "Available". * FROM "Available" INNER JOIN "Zimmer" ON "Zimmer". id = "available" .room_id WHERE (rooms.hotel_id = 5056 AND available.bookdate ZWISCHEN E'2009-10-21 'UND E'2009-10-23') GROUP BY available.bookdate ORDER BY available.updated_at
Ruby-Code, der das SQL generiert:
expiration = Available.find(:all,
:joins => [ :room ],
:conditions => [ "rooms.hotel_id = ? AND availables.bookdate BETWEEN ? AND ?", hostel_id, date.to_s, (date+days-1).to_s ],
:group => 'availables.bookdate',
:order => 'availables.updated_at')
Erwartete Ausgabe (von der funktionierenden MySQL-Abfrage):
+ ----- + ------- + ------- + ------------ + --------- + ---- ----------- + --------------- + | id | Preis | Flecken | Buchdatum | room_id | created_at | aktualisierte_at | + ----- + ------- + ------- + ------------ + --------- + ---- ----------- + --------------- + | 414 | 38,0 | 1 | 2009-11-22 | 1762 | 20.11.2009 ... | 20.11.2009 ... | | 415 | 38,0 | 1 | 2009-11-23 | 1762 | 20.11.2009 ... | 20.11.2009 ... | | 416 | 38,0 | 2 | 24.11.2009 | 1762 | 20.11.2009 ... | 20.11.2009 ... | + ----- + ------- + ------- + ------------ + --------- + ---- ----------- + --------------- + 3 Reihen im Set