慕娘9325324
2019-08-31 16:33:14
我一直在將一些MySQL查詢遷移到PostgreSQL以使用Heroku。我的大多數查詢工作正常,但當我使用group by時,我仍然遇到類似的重復錯誤:錯誤:列“XYZ”必須出現在GROUP BY子句中或用于聚合函數有人能告訴我我做錯了什么嗎?MySQL 100%工作:SELECT `availables`.*FROM `availables`INNER JOIN `rooms` ON `rooms`.id = `availables`.room_idWHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24')GROUP BY availables.bookdateORDER BY availables.updated_atPostgreSQL錯誤:ActiveRecord :: StatementInvalid:PGError:錯誤:列“availables.id”必須出現在GROUP BY子句中或用于聚合函數:SELECT“availables”。* FROM“availables”INNER JOIN“rooms”ON“rooms”。 id =“availables”.room_id WHERE(rooms.hotel_id = 5056 AND availables.bookdate BETWEEN E'2009-10-21'EN'E'2009-10-23')GROUP BY availables.bookdate ORDER BY availables.updated_at生成SQL的Ruby代碼: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') 預期輸出(來自MySQL查詢):+ ----- + ------- ------- + ------------ + + --------- + ---- ----------- + --------------- +| id | 價格| 斑點| bookdate | room_id | created_at | updated_at |+ ----- + ------- ------- + ------------ + + --------- + ---- ----------- + --------------- +| 414 | 38.0 | 1 | 2009-11-22 | 1762年| 2009-11-20 ...... | 2009-11-20 ...... || 415 | 38.0 | 1 | 2009-11-23 | 1762年| 2009-11-20 ...... | 2009-11-20 ...... || 416 | 38.0 | 2 | 2009-11-24 | 1762年| 2009-11-20 ...... | 2009-11-20 ...... |+ ----- + ------- ------- + ------------ + + --------- + ---- ----------- + --------------- +集合3行
3 回答

汪汪一只貓
TA貢獻1898條經驗 獲得超8個贊
MySQL的完全非標準兼容性GROUP BY可以由Postgres模仿DISTINCT ON??紤]一下:
MySQL的:
SELECT a,b,c,d,e FROM table GROUP BY a
每個值提供1行a(哪一個,你真的不知道)。實際上你可以猜到,因為MySQL不知道哈希聚合,所以它可能會使用排序......但它只會排序a,所以行的順序可能是隨機的。除非它使用多列索引而不是排序。好吧,無論如何,它沒有被查詢指定。
Postgres的:
SELECT DISTINCT ON (a) a,b,c,d,e FROM table ORDER BY a,b,c
這樣每個值傳送1行a,該行將根據ORDER BY查詢指定的排序中的第一行。簡單。
請注意,這里,它不是我正在計算的聚合。所以GROUP BY實際上毫無意義。DISTINCT ON更有意義。
Rails與MySQL結合,所以我并不驚訝它生成的SQL在Postgres中不起作用。

PIPIONE
TA貢獻1829條經驗 獲得超9個贊
MySQL的GROUP BY可以在沒有聚合函數的情況下使用(這與SQL標準相反),并且返回組中的第一行(我不知道基于什么標準),而PostgreSQL必須具有聚合函數(MAX,發布GROUP BY子句的列上的SUM等)。
添加回答
舉報
0/150
提交
取消