[英]Query max(date) with group by not working on SELECT … IN?
我系統中的每個頁面都有多個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_id的最后編輯的page_object
。
我究竟做錯了什么?
您的查詢未指定獲取最新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具有一個配置參數,該參數將類似地導致其拒絕此類查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.