我系统中的每个页面都有多个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。
我做错了什么?
答案 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有一个类似的配置参数会导致它拒绝这样的查询。