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的列,显示每组警报的最新警报。我该怎么做?
答案 0 :(得分:2)
这称为相关子查询。要使其工作,您需要表别名:
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;
答案 1 :(得分:1)
我会做以下
SELECT
alert_group_name,
MAX(created_at) AS latest
FROM
alerts A
GROUP BY
alert_group_name;
答案 2 :(得分:1)
如果您尝试获取每组警报的最新created_at日期,则有一种更简单的方法。
SELECT
alert,
max (created_at) AS latest
FROM
alerts
GROUP BY
alert;
答案 3 :(得分:0)
对于相关子查询,您需要引用外部查询中的表达式。
执行此操作的最佳方法是在外部查询上为表分配别名,然后在内部查询中引用该别名。最佳做法是为每个表引用分配一个别名,并限定每个列引用。
所有这些都需要做到"修复"您的查询是替换对" @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
这并不是因为 更容易 ,但更重要的是,读更容易理解语句正在做什么。< / p>
相关子查询方法对于返回的少量行(对最外层查询的限制性非常严格的WHERE子句)是有效的。但一般来说,SELECT列表中的相关子查询可以生成(我们在商店)LDQ&#34;灯光调光查询&#34;。
在我们的商店中,如果我们需要该查询返回的结果集,那么该语句可能会被重写为:
SELECT a.alert
, MAX(a.created_at) AS latest
FROM alerts a
GROUP
BY a.alert
我们肯定有一个定义了ON alerts(alert,created_at)
的索引(或者在前两个之后有一个附加列的索引。)
大小,我们
(我不会预料到这种说法会产生不同结果的任何情况。)