2011-07-22 59 views
0

我遇到了PostgreSQL查詢令人頭痛的問題。這部作品在我的本地開發環境:PostgreSQL DISTINCT問題:在本地工作,但不在服務器上

SELECT distinct (user_id) user_id, created_at, is_goodday 
FROM table 
WHERE ((created_at >= '2011-07-01 00:00:00') AND user_id = 95 
AND (created_at < '2011-08-01 00:00:00')) 
ORDER BY user_id, created_at ASC; 

...但給我的QA服務器上下面的錯誤(這是在Heroku):

PGError: ERROR: syntax error at or near "user_id" 
LINE 1: SELECT distinct (user_id) user_id, created_at, 
           ^

爲什麼會這樣?

其他可能相關的信息:

我曾嘗試單引號和雙引號的字段名稱

這是一個Rails 3應用程序,但我使用這個SQL原料,即沒有ActiveRecord的魔法

我的Postgres的本地版本9.0.4在Mac上,但我不知道是什麼版本的Heroku使用

+0

我只是試圖選擇按user_id分組的給定日期的所有條目(每個user_id有多個條目;我需要最新的條目)。它的MySQL版本(我認爲)就像select_ from table group by user_id一樣,但我被告知Postgres不允許每個SQL遵從(並且無論如何,MySQL方式並不能保證唯一user_id實際上是最近的一個) – yalestar

回答

1

根據您的評論,該查詢的標準的PostgreSQL版本將是:

SELECT user_id, created_at, is_goodday 
FROM table 
WHERE created_at >= '2011-07-01 00:00:00' 
    AND created_at < '2011-08-01 00:00:00' 
    AND user_id  = 95 
ORDER BY created_at DESC, id DESC 
LIMIT 1 

你不」在ORDER BY中需要user_id,因爲您有user_id = 95,您需要created_at DESC在ORDER BY中將最新的created_at置於頂部;那麼你LIMIT 1切斷結果集中的第一行。 GROUP BY可用於強制唯一性,或者如果您需要爲集合函數分組,但您不需要這些集合中的任何一個,因爲您可以通過ORDER BY和LIMIT獲得唯一性,並且可以將集合隱藏在ORDER BY(即你不需要MAX,因爲ORDER BY爲你做)。

既然你有你的WHERE user_id = 95,你不需要在SELECT user_id,但如果這使得它在Ruby中,土地更容易爲你,你可以把它進來

這是可能的,你可以有相同的created_at多個條目,所以我說的id DESC到ORDER BY強制PostgreSQL的選擇具有最高id。當他們真的出去找你並且錯誤肯定會幫助你的時候,他們是偏執狂。

此外,您需要在您的ORDER BY中獲得DESC以獲得頂部的最高值,ASC將最低值放在頂部。較新的時間戳將是較高的時間戳。

一般來說,GROUP BY and SELECT必須匹配,因爲:

當GROUP BY存在,它是不是有效的SELECT列表中的表達式是指未分組列除了聚集函數中,因爲將多個可能的值返回未分組列。

但這並不重要,因爲你根本不需要GROUP BY。我鏈接到8.3版本的文檔以匹配您使用的PostgreSQL版本。

可能有各種其他的方式來做到這一點,但是這是一個大概直線前進,並清楚你會得到什麼。

+0

Huzzah!謝謝你 – yalestar

0

把報價在USER_ID像user_id = '95'。您的查詢應該是

SELECT distinct (user_id) as uid, created_at, is_goodday FROM table WHERE 
((created_at >= '2011-07-01 00:00:00') AND user_id = '95' AND (created_at < '2011-08-01 00:00:00')) ORDER BY user_id, created_at ASC; 
+0

嗯,沒有運氣。謝謝 – yalestar

+0

@Yalestar,編輯了這篇文章。再試一次。 – Rahul

0

您正在使用DISTINCT ON(不寫ON)。也許你應該寫ON。也許你的postgres服務器是在功能實現之前的日期(現在已經很老了)。

如果一切都失敗了,你總是可以做到這一點與一些GROUP BY ...

相關問題