1. ホーム
  2. mysql

GROUP BY having MAX date

2023-11-12 10:07:07

質問

このコードを実行すると問題が発生します。

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句やコマンドはありますか?

事前にありがとうございます。

どのように解決するのですか?

WHERE句にサブクエリを入れて、n.control_numberに制限すると、サブクエリが何度も実行されることになります。 これを 相関サブクエリ と呼ばれ、しばしばパフォーマンスキラーになります。

FROM句でサブクエリを一度実行し、管理番号ごとの最大日付を取得する方がよいでしょう。

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);