2011-07-22 153 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 ...

相关问题