2017-07-14 56 views
-1

作爲mysql(MariaDB)中幾輛車的車輛日誌的一部分,我需要查找包含每個車輛最大里程數的行,並查詢一個查詢。 該表包含列:id,vehicle_id,km_start,km_end。 因此,任務是爲每個vehicle_id找到max(max(km_start,km_end))行。使用GREATEST在哪裏

我發現,如果km_end總是存在

SELECT id 
FROM log 
WHERE (vehicle_id,km_end) IN (SELECT vehicle_id, MAX(IFNULL(km_end,0)) 
           FROM log 
           GROUP BY vehicle_id) 

將做的工作。但是,如果km_end尚未輸入,它將包含0.因此,最大里程數也可能在km_start中。

我試圖

SELECT id 
FROM log 
WHERE (vehicle_id,km_max) IN (SELECT vehicle_id, 
            GREATEST(MAX(IFNULL(km_start,0)), 
               MAX(IFNULL(km_end,0))) AS km_max 
           FROM log GROUP BY vehicle_id) 

返回 ERROR 1054(42S22):在 'IN/ALL/ANY子查詢'

+0

看到的是https://元.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-a-very-simple-sql-query – Strawberry

回答

0

未知列 'km_max' 那將是因爲當值列表在子查詢的外部應參考log中的字段。您可以使用代替連接:

SELECT id 
FROM log AS l 
INNER JOIN (
    SELECT vehicle_id 
     , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) AS km_max 
    FROM log 
    GROUP BY vehicle_id 
) AS lMax 
ON l.vehicle_id = lMax.vehicle_id 
AND lMax.km_max IN (l.km_start, l.km_end) 

另外,我想也許改變這種 GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0)))GREATEST(IFNULL(MAX(km_start,0)), IFNULL(MAX(km_end,0)));我不確定它是否完全重要,但直覺上我認爲它可能會有更好的表現。 大多數聚合函數忽略空值,只有遇到空值時才返回null;所以你唯一需要擔心的是在計算最大值之後。 (如果您使用平均,想算空爲0的這將是一個不同的問題,但。)


或者,這可以工作,以及:

WHERE (vehicle_id 
     , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) 
    ) IN (SELECT vehicle_id 
        , GREATEST(MAX(IFNULL(km_start,0)), MAX(IFNULL(km_end,0))) AS km_max 
      FROM log 
      GROUP BY vehicle_id 
      ) 
+0

非常感謝, Uueerdo。 你的第一個建議就像魅力一樣。 更改MAX和IFNULL的順序拋出 錯誤1064(42000):您的SQL語法有錯誤;檢查對應於您的MariaDB服務器版本的手冊,以獲得在0)附近使用的正確語法),IFNULL(MAX(km_end,0)))AS km_max FROM log GROUP BY vehicle_id)AS lMax ON l'at line 1 Your第二個建議(或者...)拋出 錯誤1111(HY000):無效的使用組功能 將使用第一個。 –

+0

回覆:交換IFNULL和MAX;您需要移動IFNULL的第二個參數以及_i.e。 'IFNULL(MAX(x),0)',而不是'IFNULL(MAX(x,0))'。 Re:第二個建議;哦,是的,不能在一個WHERE聚合;你可以放入一個HAVING(但有些人會認爲它是在相同的上下文中使用沒有GROUP BY的HAVING語言的濫用。) – Uueerdo

+0

嘗試過IFNULL(MAX(x),0)是IFNULL(MAX(x, 0))。它現在有效。謝謝。 –