Mysql 将查询结果传递到子查询

Mysql 将查询结果传递到子查询,mysql,sql,Mysql,Sql,我在上面的查询中遇到了一个问题,我想将每个警报传递到子查询中,这样我就有一个名为latest的列,该列显示每组警报的最新警报。我应该怎么做?这称为相关子查询。要使其正常工作,需要使用表别名: 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 alert,  
  (select created_at from alerts 
    WHERE alert = @ALERT ORDER BY created_at desc LIMIT 1) 
      AS latest FROM alerts GROUP BY alert; 
表别名是一个好习惯,因为它们通常使SQL更具可读性。在列引用中使用表别名也是一个好主意,这样您就可以很容易地知道列的来源

编辑:

如果您确实想要最新版本,只需执行以下操作即可获得:

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; 

这称为相关子查询。要使其正常工作,需要使用表别名:

SELECT alert,  
  (select created_at from alerts 
    WHERE alert = @ALERT ORDER BY created_at desc LIMIT 1) 
      AS latest FROM alerts GROUP BY alert; 
表别名是一个好习惯,因为它们通常使SQL更具可读性。在列引用中使用表别名也是一个好主意,这样您就可以很容易地知道列的来源

编辑:

如果您确实想要最新版本,只需执行以下操作即可获得:

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; 

我会做下面的事情

select alert, max(created_at)
from alerts
group by alert;

我会做下面的事情

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; 

如果您试图获取每组警报的最新创建日期,有一种更简单的方法

SELECT 
    alert_group_name, 
    MAX(created_at) AS latest 
FROM 
     alerts A 
GROUP BY 
     alert_group_name; 

对于相关子查询,需要引用外部查询中的表达式

最好的方法是在外部查询中将别名分配给表,然后在内部查询中引用该别名。最佳实践是为每个表引用指定一个别名,并限定每个列引用

要“修复”查询,只需将对“
@ALERT
”的引用替换为外部查询表中对
ALERT
列的引用

在我们的商店中,该语句的格式如下:

SELECT
    alert,
    max (created_at) AS latest
FROM
    alerts
GROUP BY
    alert;
不是因为这样写更容易,而是更重要的是更容易阅读和理解陈述的内容

相关子查询方法对于返回的少量行(最外层查询上非常严格的WHERE子句)是有效的。但是,一般来说,SELECT列表中的相关子查询可以使LDQ(我们在商店中所指的)成为“调光查询”

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

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
我们肯定会在警报上定义一个索引
(警报,创建时间)
(或者在前两个之后有一个附加列的索引) 大小,我们


(我不认为该语句会返回不同的结果。)

对于相关子查询,您需要引用外部查询中的表达式

最好的方法是在外部查询中将别名分配给表,然后在内部查询中引用该别名。最佳实践是为每个表引用指定一个别名,并限定每个列引用

要“修复”查询,只需将对“
@ALERT
”的引用替换为外部查询表中对
ALERT
列的引用

在我们的商店中,该语句的格式如下:

SELECT
    alert,
    max (created_at) AS latest
FROM
    alerts
GROUP BY
    alert;
不是因为这样写更容易,而是更重要的是更容易阅读和理解陈述的内容

相关子查询方法对于返回的少量行(最外层查询上非常严格的WHERE子句)是有效的。但是,一般来说,SELECT列表中的相关子查询可以使LDQ(我们在商店中所指的)成为“调光查询”

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

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
我们肯定会在警报上定义一个索引
(警报,创建时间)
(或者在前两个之后有一个附加列的索引) 大小,我们


(我不认为此语句会返回不同的结果。)

很高兴知道。谢谢,很高兴知道。非常感谢。