通过不处理SELECT ... IN来查询max(date)with group?

时间:2016-05-24 13:17:06

标签: mysql

我系统中的每个页面都有多个page_objects。 我需要返回每页page_objects的last_changed记录。

为减少数据库影响,我有一个SELECT ... IN查询,每页返回最后编辑的每个page_object:

SELECT object, f_page_id, page_object_id, last_change
FROM page_objects 
WHERE f_page_id IN (page_id1, page_id2, page_id3, etc...) GROUP BY f_page_id
ORDER BY last_change ASC;

当然这不起作用,因为在GROUP BY之前应用ORDER BY,所以我更改了查询:

SELECT object, f_page_id, page_object_id,  max(UNIX_TIMESTAMP(last_change))
FROM page_objects 
WHERE f_page_id IN (page_id1, page_id2, page_id3, etc...) GROUP BY f_page_id

但是这仍然没有返回最后编辑的page_object每页_id。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的查询未指定获取最新last_change的记录。仅仅是它获得了last_change的最新价值。 GROUP BY子句中未提及的其他非聚合值(即,不是MAX或MIN等聚合函数的结果)可以来自分组值的任何行。

因此,您使用子查询获取每个页面的最新值,然后将其连接到主表以获取匹配的行

这样的事情: -

SELECT page_objects.object, 
        page_objects.f_page_id, 
        page_objects.page_object_id, 
        page_objects.last_change
FROM page_objects 
INNER JOIN 
(
    SELECT f_page_id, MAX(last_change) AS latest_last_change
    FROM page_objects 
    GROUP BY f_page_id
) sub0
ON page_objects.f_page_id = sub0.f_page_id
AND page_objects.last_change = sub0.latest_last_change
WHERE page_objects.f_page_id IN (page_id1, page_id2, page_id3, etc...) 
ORDER BY last_change DESC 

请注意,MySQL在允许您使用GROUP BY子句中未提及的非聚合列时非常不寻常(因为它违反了SQL标准,除非在非常特殊的情况下)。如果尝试这种方法,大多数SQL都会发出错误,并且MySQL有一个类似的配置参数会导致它拒绝这样的查询。