我有一个日志表,如下所示:
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秒。
建议?
答案 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>
有关使用in
或join
的讨论,请另见SQL JOIN vs IN performance?和IN vs. JOIN with large rowsets。
答案 1 :(得分:1)
此查询提供执行group by操作后的最新行。 还显示了加入另一个表格。
SELECT messages。*,users
。id
AS user_id,
users
。first_name
,
users
。last_name
来自消息
LEFT JOIN users
点击users
。id
= messages
。sender_id
WHERE messages.id IN(
SELECT MAX(messages.id)
来自消息
WHERE messages.receiver_id = 2
GROUP BY messages.sender_id);