MySQL - 不同结果显示每组最新记录

标签 mysql

我正在尝试找出最有效的方法来检索每个组的最新记录。

我设法生成两个不同的查询。但细节略有不同。

这些是 gcm_notification 记录。 还有更多的记录存在。但现在我只想专注于一张唱片。从图像中,我们可以看到带有 flag = 1

latest id = 1393
SELECT id, post_id, registration_id, flag
FROM gcm_notification
WHERE post_id = 1743
AND registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-"

enter image description here

现在我正在尝试使用 2 个不同的查询来检索每个组的最新记录。

选项 1:

SELECT MAX(id) as latest_id, post_id, flag
FROM gcm_notification
WHERE registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-"
GROUP BY post_id

enter image description here

选项 2:

SELECT id, post_id, flag
FROM gcm_notification t1
    RIGHT JOIN (
            SELECT MAX(id) AS latest 
            FROM wp_spc_gcm_notification 
            WHERE registration_id =  "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-"
            GROUP BY post_id) t2
    ON t1.id = t2.latest
WHERE registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-"
GROUP BY post_id

enter image description here

如您所见,选项 2 显示了正确的结果。

这是我的问题,
为什么选项1显示正确的idflag值是错误的?是因为 MAX 只更新了当前的 id 而没有更新 flag 吗?

-- 抱歉,如果 SQL 查询太乱且难以阅读,因为我不知道如何突出显示语法。 --

最佳答案

非聚合列的选择是不确定的,这就是第一个查询不正确的原因。

MySQL 手册:

http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

如果禁用 ONLY_FULL_GROUP_BY,MySQL 对 GROUP BY 的标准 SQL 使用的扩展允许选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列,即使这些列在功能上不依赖于 GROUP BY 列。这会导致 MySQL 接受前面的查询。 在这种情况下,服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。 此外,添加 ORDER BY 子句不会影响从每个组中选择值。结果集排序发生在选择值之后,并且 ORDER BY 不影响服务器选择每个组中的哪个值。禁用 ONLY_FULL_GROUP_BY 主要是因为您知道,由于数据的某些属性,每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都是相同的。

关于MySQL - 不同结果显示每组最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36169649/

相关文章:

php - $_GET[] 和通配符的 MySQL 注入(inject)安全性的正确语法是什么

来自同一表的 MySQL 2 LEFT JOIN

mysql - 使用索引对 MYSQL 进行计数查询优化

php - Mac和Windows上传文件名编码不同的问题

php - MySQL,如何插入空日期

mysql - 使用所选列中的值更新多行

mysql - 在网站上的 MySQL 中使用 UTC

php - 只显示长度小于 php mysql 的注释

php - MYSQL 查询未执行或未显示错误

python - 即使安装了 MySQL-python,也没有名为 MySQLdb 的模块?