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; 

各アラートをサブクエリに渡して、アラートの各グループの最新のアラートを表示する最新の列を作成したい上記のクエリに問題があります。どうすればいいですか?

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

アラートのグループごとに最新の created_at 日付を取得しようとしている場合は、もっと簡単な方法があります。

SELECT
    alert,
    max (created_at) AS latest
FROM
    alerts
GROUP BY
    alert;
于 2013-08-08T20:27:50.443 に答える
1

私は次のことをします

SELECT 
    alert_group_name, 
    MAX(created_at) AS latest 
FROM 
     alerts A 
GROUP BY 
     alert_group_name; 
于 2013-08-08T20:22:28.710 に答える
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 句)。 LDQ「調光クエリ」。

私たちのショップでは、そのクエリによって返された結果セットが必要な場合、そのステートメントは次のように書き換えられる可能性があります。

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

そして、間違いなくインデックスを定義しますON alerts(alert,created_at)(または、最初の 2 つの列の後に追加の列を持つインデックス)。

(このステートメントが別の結果を返すケースは想定していません。)

于 2013-08-08T20:40:30.053 に答える