2013-04-15 36 views
3

我時,我正在執行PostgreSQL的這個查詢此錯誤:PostgreSQL的分組錯誤

 
SQLSTATE[42803]: Grouping error: 7 ERROR: column "posts.title" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: SELECT DISTINCT posts.id, posts.* FROM "posts" GROUP BY "pos.. 

,這是我的查詢:

SELECT DISTINCT posts.id, posts.* 
FROM "posts" 
GROUP BY "posts"."id" 
ORDER BY "posts"."id" DESC 
LIMIT 20 OFFSET 0 

雖然當我與MySQL執行它沒有工作,那我該如何解決這個問題?

+4

爲什麼你使用'distinct' **和** droup。這沒有任何意義。爲什麼你選擇id列兩次? (一次明確地和一次由於'*') –

+0

PostgreSQL版本?如果'posts.id'是'PRIMARY KEY',那麼PostgreSQL的較新版本通常會執行這個操作。這就是說,這是一個完全荒謬的問題。 –

+0

不知道你想達到什麼。如果「id」是主要的,你不需要使用'GROUP'或者使用'DISTINCT'(正如前面指出的那樣,這裏是多餘的)。 – marcj

回答

3

問題是,在PostgreSQL中,你需要將你想要的所有列添加到你的組中。

所以你的說法應該是像

SELECT * FROM table GROUP BY column1, column2... 
+7

這不是特定於Postgres,這是SQL標準所要求的。 MySQL對此的草率實施更像是一個bug而不是一項功能。 MySQL應該配置爲使用'strict_group_by'來避免這種情況。 –

+0

@a_horse_with_no_name使用InnoDB表的'ANSI'和'STRICT'的MySQL基本理解。可惜,它默認情況下不是這樣的。 –

+0

@CraigRinger:'ansi'不包括'ONLY_FULL_GROUP_BY',你需要單獨啓用它。 –

-1

試試這個。

SELECT DISTINCT * FROM 
(SELECT ROW_NUMBER() OVER(PARTITION BY "posts"."id" ORDER BY "posts"."id") No, posts.* 
FROM "posts" ) AS T1 WHERE T1.NO = 1 
ORDER BY "id" DESC LIMIT 20 OFFSET 0 
+0

這對你有幫助嗎? – Harshil

+1

不,不是,我真的在尋找錯誤的起源。 – user2277033