SELECT alert,
(select created_at from alerts
WHERE alert = @ALERT ORDER BY created_at desc LIMIT 1)
AS latest FROM alerts GROUP BY alert;
我在上面的查询中遇到问题,我想将每个警报传递到子查询中,以便我有一个名为 latest 的列,它显示每组警报的最新警报。我该怎么做?
这称为相关子查询。要使其工作,您需要表别名:
SELECT a1.alert,
(select a2.created_at
from alerts a2
WHERE a2.alert = a1.alert
ORDER BY a2.created_at desc
LIMIT 1
) AS latest
FROM alerts a1
GROUP BY a1.alert;
表别名是一个好习惯,因为它们通常使 SQL 更具可读性。将表别名与列引用一起使用也是一个好主意,这样您就可以轻松知道列的来源。
编辑:
如果您真的想要最新的,只需执行以下操作即可获得它:
select alert, max(created_at)
from alerts
group by alert;
我会做以下事情
SELECT
alert_group_name,
MAX(created_at) AS latest
FROM
alerts A
GROUP BY
alert_group_name;
如果您尝试获取每组警报的最新 created_at 日期,则有一种更简单的方法。
SELECT
alert,
max (created_at) AS latest
FROM
alerts
GROUP BY
alert;
对于相关子查询,您需要引用外部查询中的表达式。
最好的方法是在外部查询中为表分配一个别名,然后在内部查询中引用它。最佳实践是为每个表引用分配一个别名,并限定每个列引用。
“修复”您的查询所需要做的就是用对外部查询表中的列的引用替换对“ @ALERT
”的引用。alert
在我们的商店中,该语句的格式如下:
SELECT a.alert
, (SELECT l.created_at
FROM alerts l
WHERE l.alert = a.alert
ORDER BY l.created_at DESC
LIMIT 1
) AS latest
FROM alerts a
GROUP
BY a.alert
不是因为这样写更容易,更重要的是它更容易阅读和理解语句在做什么。
相关子查询方法对于返回的少量行可能是有效的(最外层查询上的一个非常严格的 WHERE 子句。)但一般来说,SELECT 列表中的相关子查询可以产生(我们在商店中提到的)一个LDQ《调光查询》。
在我们的商店中,如果我们需要该查询返回的结果集,那么该语句可能会被重写为:
SELECT a.alert
, MAX(a.created_at) AS latest
FROM alerts a
GROUP
BY a.alert
而且我们肯定会定义一个索引ON alerts(alert,created_at)
(或在前两个之后具有附加列的索引。)大小,我们
(我预计此语句不会返回不同结果的任何情况。)