2012-04-22 72 views
2

为“LAST”聚合函数提出的解决方案我有如下所示日志表:在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); 

然而,对于4000行的一个非常小的表,这个查询时间超过60秒,我的机器上执行。

对此提出建议?

回答

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的子索引索引,尽管这不像重复扫描整个表一样重要。

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

+0

Thanks @Ben - id字段被索引(主键),所以这将完美工作。谢谢! – Philip 2012-04-22 12:28:11

1

此查询提供按操作执行组后的最新行。 还显示了另一张桌子的连接。

SELECT messages。*,usersid AS user_id, usersfirst_name, userslast_name FROM消息 LEFT JOIN users ON usersid = messages。 ( SELECT MAX(messages.id) FROM messages WHERE messages.receiver_id = 2 GROUP BY messages.sender_id);