1

この種の質問は時々聞かれます。提供されたクエリは機能しますが、パフォーマンスに影響します。

私は方法を試しましたJOIN

SELECT * 
FROM nbk_tabl
INNER JOIN (
        SELECT ITEM_NO, MAX(REF_DATE) as LDATE
        FROM nbk_tabl 
        GROUP BY ITEM_NO) nbk2 
ON nbk_tabl.REF_DATE = nbk2.LDATE 
AND nbk_tabl.ITEM_NO = nbk2.ITEM_NO

そしてタプル1(ずっと遅い):

SELECT * 
FROM nbk_tabl
WHERE REF_DATE IN (
                    SELECT MAX(REF_DATE) 
                    FROM nbk_tabl 
                    GROUP BY ITEM_NO
                  )

これを行う他のパフォーマンスに優しい方法はありますか?

編集:明確にするために、これを数千行のテーブルに適用しています。

4

2 に答える 2

2

はい、もっと速い方法があります。

select *
from nbk_table
order by ref_date desc
limit <n>

戻りたい行数はどこにありますか。

持続する。特定のアイテムに対してこれを実行しようとしているようです。あなたはこれを試すかもしれません:

select *
from nbk_table n
where ref_date = (select max(ref_date) from nbk_table n2 where n.item_no = n2.item_no)

「in」バージョンよりも最適化される可能性があります。

于 2012-08-16T01:40:24.820 に答える
0

また、MySQL ではユーザー変数を使用できます (nbk_tabl.Item_no<>0 とします):

select *
from (
   select nbk_tabl.*,
      @i := if(@ITEM_NO = ITEM_NO, @i + 1, 1) as row_num,
      @ITEM_NO := ITEM_NO as t_itemNo
  from nbk_tabl,(select @i := 0, @ITEM_NO := 0) t
  order by Item_no, REF_DATE DESC
) as x where x.row_num = 1;
于 2012-08-16T12:56:14.713 に答える