针对MySQL中“LAST”的聚合函数的建议解决方案

时间:2012-04-22 12:13:55

标签: mysql

我有一个日志表,如下所示:

logs (_id_, client, metric, value);

我试图从PHP前端在MySQL中编写以下查询以从日志表中获取信息。

SELECT client, LAST(value) AS value
FROM logs 
WHERE metric = 'free space'
GROUP BY client;

当然,LAST不是有效的聚合函数。

我建议的解决方案是:

SELECT client, value 
FROM logs 
WHERE id IN (
   SELECT MAX(id) 
   FROM logs 
   WHERE metric = 'free space' 
   GROUP BY client);

但是,对于一个包含4,000行的非常小的表,此查询在我的开发计算机上执行时间超过60秒。

建议?

2 个答案:

答案 0 :(得分:3)

您应该使用联接

执行此操作
SELECT l.client, l.value 
  FROM logs l
  JOIN ( SELECT client, MAX(id) as id
           FROM logs 
          WHERE metric = 'free space' 
          GROUP BY client ) s
    ON l.id = s.id

对于外部查询,您还应该在id上具有(如果可能的唯一)索引,这使得联接可以使用索引。如果优化非常重要,您可能还需要client, id或可能id, client的索引作为子选择,但这并不像您必须扫描整个表一样重要。< / p>

有关使用injoin的讨论,请另见SQL JOIN vs IN performance?IN vs. JOIN with large rowsets

答案 1 :(得分:1)

此查询提供执行group by操作后的最新行。 还显示了加入另一个表格。

SELECT messages。*,usersid AS user_id, usersfirst_nameuserslast_name 来自消息 LEFT JOIN users点击usersid = messagessender_id WHERE messages.id IN( SELECT MAX(messages.id) 来自消息 WHERE messages.receiver_id = 2 GROUP BY messages.sender_id);