【发布时间】:2016-11-30 16:29:03
【问题描述】:
我正在尝试从表中获取多个值,其中 GROUP BY 仅针对其中一列。为简化起见,我将使用模型留言簿表作为示例:
postNumber | user | text | date | portal
-----------------------------------------------
1 | Michael | "nice blog" | 10/12| fitness
2 | Ronald | "hello!" | 12/12| lounge
1 | Michael | "beautiful" | 05/11| pictures
2 | Sandra | "great pic" | 10/12| pictures
假设留言簿的首页必须打印最新的来宾帖子,但每个门户(健身、休息室和图片)只能打印一个。期望的结果是:
- michael/“不错的博客”/健身
- 罗纳德/“你好”/休息室
- 和 sandra/“好照片”/图片。
排除的帖子将是 Michael/"beautiful"/pictures,因为它不是该门户的最新帖子。
以下查询对于更现代的 mySQL 服务器无效,抛出如下所述的错误:
SELECT max(postNumber), user, text, date, portal FROM guestbook GROUP BY portal;
GROUP BY 子句并包含非聚合列“database.table.columnName”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容
但是,下面这个更有限的查询可以实现预期的结果,但它不能影响其余需要的列(用户、文本、日期),这正是我遇到的问题:
SELECT max(postNumber), portal FROM guestbook GROUP BY portal;
需要注意的是,可以通过将用户、文本和日期添加到 GROUP BY 来修复第一个查询,但是像这样进行复合分组将不再每个门户仅检索一个条目。
如果有人对此问题有解决方案,请详细说明,因为我自己或通过在线研究无法找到方法。
编辑:我尝试了以下查询,但没有结果,因为 RIGHT JOIN 为我提供了左表中的值(仅门户和帖子编号),不确定原因:
'SELECT t1.portal, max(t1.postNumber) from guestbook t1 RIGHT OUTER JOIN (SELECT * from guestbook) t2 on t1.postNumber = t2.postNumber GROUP BY portal LIMIT ?';
【问题讨论】:
-
您可以尝试按照in this answer的描述禁用 only_full_group_by
-
我明白了,但据我所知,现在 only_full_group_by 是默认值的原因是,否则它可能会产生松散、随机的结果,最好制作更坚固的 SQL。如果可能的话,我想实现一个与新的 mySQL 默认设置兼容的解决方案