簡體   English   中英

通過不使用SELECT…IN來查詢組的max(date)。

[英]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 BYORDER 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM