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

时间:2016-03-23 04:05:16

标签: mysql

我试图找出最有效的方法来检索每组的最新记录。

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

这些是gcm_notification条记录。 存在更多记录。但现在我只想专注于一个单一的记录。从图片中,我们可以看到latest id = 1393flag = 1

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 显示正确的id,但flag值是错误的?是因为MAX只更新当前的id而不是标志?

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

1 个答案:

答案 0 :(得分:1)

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

MySQL手册:

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

如果禁用ONLY_FULL_GROUP_BY,则对GROUP BY的标准SQL使用的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。 In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate, which is probably not what you want. 此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会发生结果集排序,ORDER BY不会影响服务器选择的每个组中的值。禁用ONLY_FULL_GROUP_BY主要是因为您知道由于数据的某些属性,每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都是相同的。