2017-07-14 64 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))。它现在有效。谢谢。 –