76

このコードを実行するときに問題があります:

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING control_number=n.control_number)

基本的には、管理番号ごとに最新の日付を返したいと思っています。上記のクエリは正しい出力を返しますが、37 秒かかります。出力が表示される前。

上記のクエリよりも高速に実行できる SQL 句またはコマンドは他にありますか?

前もって感謝します。

4

4 に答える 4

160

サブクエリを WHERE 句に入れて n.control_number に制限すると、サブクエリが何度も実行されることになります。これは相関サブクエリと呼ばれ、多くの場合、パフォーマンスを低下させます。

コントロール番号ごとの最大日付を取得するには、FROM 句でサブクエリを 1 回実行することをお勧めします。

SELECT n.* 
FROM tblpm n 
INNER JOIN (
  SELECT control_number, MAX(date_updated) AS date_updated
  FROM tblpm GROUP BY control_number
) AS max USING (control_number, date_updated);
于 2013-08-14T02:08:57.637 に答える
24

そのサブクエリでグループ化する必要はありません... where 句で十分です:

SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
    FROM tblpm WHERE control_number=n.control_number)

また、「date_updated」列にインデックスはありますか? それは確かに役立つでしょう。

于 2013-08-14T02:03:00.467 に答える
-1

group by を使用しない別の方法:

SELECT * FROM tblpm n 
  WHERE date_updated=(SELECT date_updated FROM tblpm n 
                        ORDER BY date_updated desc LIMIT 1)
于 2016-12-31T12:13:16.760 に答える
-9

HAVING で素早く簡単:

SELECT * FROM tblpm n 
FROM tblpm GROUP BY control_number 
HAVING date_updated=MAX(date_updated);

のコンテキストでHAVINGMAX各グループの最大値を見つけます。各グループの最新のエントリのみが を満たしdate_updated=max(date_updated)ます。グループ内で最新が同点の場合、両方がHAVINGフィルターを通過しますGROUP BYが、返されるテーブルには 1 つだけが表示されることを意味します。

于 2016-03-14T10:36:53.837 に答える