亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PostgreSQL GROUP BY與MySQL不同?

PostgreSQL GROUP BY與MySQL不同?

慕娘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中不起作用。


查看完整回答
反對 回復 2019-08-31
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

PostgreSQL比MySQL更符合SQL。輸出中的所有字段(除了具有聚合函數的計算字段)必須存在于GROUP BY子句中。


查看完整回答
反對 回復 2019-08-31
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

MySQL的GROUP BY可以在沒有聚合函數的情況下使用(這與SQL標準相反),并且返回組中的第一行(我不知道基于什么標準),而PostgreSQL必須具有聚合函數(MAX,發布GROUP BY子句的列上的SUM等)。


查看完整回答
反對 回復 2019-08-31
  • 3 回答
  • 0 關注
  • 1998 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號