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;
アラートのグループごとに最新の created_at 日付を取得しようとしている場合は、もっと簡単な方法があります。
SELECT
alert,
max (created_at) AS latest
FROM
alerts
GROUP BY
alert;
私は次のことをします
SELECT
alert_group_name,
MAX(created_at) AS latest
FROM
alerts A
GROUP BY
alert_group_name;
相関サブクエリの場合、外側のクエリから式を参照する必要があります。
これを行う最善の方法は、外側のクエリでテーブルにエイリアスを割り当て、内側のクエリでそれを参照することです。ベスト プラクティスは、すべてのテーブル参照にエイリアスを割り当て、すべての列参照を修飾することです。
クエリを「修正」するために行う必要があるのは、「@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 句)。 LDQ「調光クエリ」。
私たちのショップでは、そのクエリによって返された結果セットが必要な場合、そのステートメントは次のように書き換えられる可能性があります。
SELECT a.alert
, MAX(a.created_at) AS latest
FROM alerts a
GROUP
BY a.alert
そして、間違いなくインデックスを定義しますON alerts(alert,created_at)
(または、最初の 2 つの列の後に追加の列を持つインデックス)。
(このステートメントが別の結果を返すケースは想定していません。)