将查询结果传递给子查询

时间:2013-08-08 20:15:00

标签: mysql sql

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的列,显示每组警报的最新警报。我该怎么做?

4 个答案:

答案 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)的索引(或者在前两个之后有一个附加列的索引。) 大小,我们

(我不会预料到这种说法会产生不同结果的任何情况。)