PG Group by問題求救


#1

各位大大好,
請問一下目前我碰到一個group by的問題,我想要把訂單的產品做一個group並且把價錢加總

OrderItem.group(:product_name)

但會出現一個錯誤訊息

Hirb Error: PG::GroupingError: ERROR:  column "order_items.id" must appear in the GROUP BY clause or be used in an aggregate function

請問這是什麼原因呢?


#2

Rails console 應該有 SQL log 才是,把 SQL log 才知道怎樣判讀哩


#3

大大好,
我剛剛出現的錯誤訊息是

DEBUG -- :   OrderItem Load (11.1ms)  SELECT "order_items".* FROM "order_items" GROUP BY "order_items"."product_name" ORDER BY product_id ASC
Hirb Error: PG::GroupingError: ERROR:  column "order_items.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "order_items".* FROM "order_items" GROUP BY "order_it...
               ^
: SELECT "order_items".* FROM "order_items" GROUP BY "order_items"."product_name" ORDER BY product_id ASC

再麻煩大大過目了 感激不盡


#4

okay…我懂了 XD 看來是 PostgreSQL 機車的地方,我用 MySQL 記得沒這問題就是

簡單的來說如果你用 name 來做 group by 的壓縮,剛好中三筆,則你的 primary key 類似有 1 , 2 , 3 這三個 id ,它不知道該怎樣丟這資料給你,因為 min 為 1 , avg 為 2 , max 為 3,mysql 內定應該都是 min ,而 PostgreSQL 強迫你要指定 group by function 唄

你可以試試看類似

OrderItem.group(:product_name).select("MIN(id) AS id , COUNT(id) AS tcount , product_name")

或是有人建議的

OrderItem.group(:product_name).select("DISTINCT ON (id) *") 

簡單的來說指定 group by 後的 function 應該就 ok 了才是,不然就是指定該欄位不為重複,不過我不玩 PG 的,所以留給你測,還有問題再說聲哩

順便列 group by function 的 doc 給你,用的單字可能不一樣,但是是同一種東西就是

PostgreSQL 的
https://www.postgresql.org/docs/9.1/static/functions-aggregate.html

MySQL 的
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html