我一直在将一些MySQL查询迁移到PostgreSQL以使用Heroku.我的大多数查询都可以正常工作,但在使用group by时,我经常会遇到类似的错误:

错误:列"XYZ"必须出现在GROUP BY子句中,或用于

有人能告诉我我做错了什么吗?


SELECT `availables`.*
FROM `availables`
INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id
WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24')
GROUP BY availables.bookdate
ORDER BY availables.updated_at


ActiveRecord::语句无效:PGError:错误:列


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')  


+-----+-------+-------+------------+---------+---------------+---------------+
| id  | price | spots | 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 rows in set

推荐答案

MySQL完全不符合标准的GROUP BY可以被Postgres的DISTINCT ON模仿.考虑一下:

MySQL:

SELECT a,b,c,d,e FROM table GROUP BY a

这将为每a个值提供1行(您不知道是哪一行).实际上你可以猜到,因为MySQL不知道散列聚合,所以它可能会使用排序...但它只能按a排序,因此行的顺序可能是随机的.除非它使用多列索引而不是排序.无论如何,它不是由查询指定的.

博士后:

SELECT DISTINCT ON (a) a,b,c,d,e FROM table ORDER BY a,b,c

这将 for each 值a提供1行,根据查询指定的ORDER BY,这一行将是排序中的第一行.易于理解的

注意,在这里,我计算的不是聚合.所以GROUP BY美元实际上毫无意义.DISTINCT ON更有意义.

Rails与MySQL结合在一起,所以它生成的SQL在Postgres中不起作用,我并不感到惊讶.

Mysql相关问答推荐

如何根据mysql中的用户组获取文档?

MySQL生成的整型计算可以为空吗?

MySQL全文索引和不区分大小写搜索带来的挑战

计算同一个表中的两列,然后将两者都算作总数

如何在 SQL 中迭代所有名称和排名排列

根据 MySql 中同一表中的多列 Select 多列

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

Mysql JSON_REMOVE 数组键和值 (MariaDB)

Django中的MYSQL查询等效

Mysql insert with loop out of select 语句

基于两个单元格值的 SQL 过滤表

使用 MySQL LIMIT、OFFSET 进行分页

在 MySQL 中,我应该 Select 哪种排序规则?

在 Android 上运行 AMP (apache mysql php)

MySQL计算特定值的列

字符ي和ی以及波斯语的区别 - Mysql

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

将 JavaScript 到日期对象转换为 MySQL 日期格式 (YYYY-MM-DD)

在 MySQL 中的子查询上使用 GROUP_CONCAT

mysql错误'TYPE = MyISAM'