[英]Passing query result into subquery
SELECT alert,
(select created_at from alerts
WHERE alert = @ALERT ORDER BY created_at desc LIMIT 1)
AS latest FROM alerts GROUP BY alert;
我在上面的查詢中遇到了一個問題,我想將每個警報傳遞到子查詢中,以便我有一個名為“最新”的列,該列顯示每組警報的最新警報。 我應該怎么做?
這稱為相關子查詢。 要使其正常工作,您需要表別名:
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)
定義一個索引(或在前兩個索引之后具有其他列的索引)。
(我預計此語句不會返回不同的結果。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.