0
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

4 回答 4

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;
于 2013-08-08T20:16:59.617 回答
1

我会做以下事情

SELECT 
    alert_group_name, 
    MAX(created_at) AS latest 
FROM 
     alerts A 
GROUP BY 
     alert_group_name; 
于 2013-08-08T20:22:28.710 回答
1

如果您尝试获取每组警报的最新 created_at 日期,则有一种更简单的方法。

SELECT
    alert,
    max (created_at) AS latest
FROM
    alerts
GROUP BY
    alert;
于 2013-08-08T20:27:50.443 回答
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

不是因为这样更容易,更重要的是它更容易阅读和理解语句在做什么。

相关子查询方法对于返回的少量行可能是有效的(最外层查询上的一个非常严格的 WHERE 子句。)但一般来说,SELECT 列表中的相关子查询可以产生(我们在商店中提到的)一个LDQ《调光查询》。

在我们的商店中,如果我们需要该查询返回的结果集,那么该语句可能会被重写为:

SELECT a.alert
     , MAX(a.created_at) AS latest
  FROM alerts a
 GROUP
    BY a.alert

而且我们肯定会定义一个索引ON alerts(alert,created_at)(或在前两个之后具有附加列的索引。)大小,我们

(我预计此语句不会返回不同结果的任何情况。)

于 2013-08-08T20:40:30.053 回答