2016-03-23 40 views
1

我试图找出最有效的方式来检索每个组的最新记录。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显示正确的idflag值是错误的?是否因为MAX只更新当前id而不是标志?

- 对不起,如果SQL查询太混乱,难以阅读,因为我不知道如何突出语法。 -

回答

1

非聚集列的选择是不确定的,这就是为什么第一个查询不正确。

MySQL手册:

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

如果ONLY_FULL_GROUP_BY被禁用,一个MySQL扩展到标准SQL使用GROUP BY的允许选择列表,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中命名的非聚合列中的所有值对每个组都相同时。

+0

这是我正在寻找的解释! 谢谢你突出显示。 – WeeHong

相关问题