2012-08-16 57 views
1

此類問題每隔一段時間問一次。提供的查詢有效,但會影響性能。根據日期在MySQL中獲取最新行(按另一列分組)

我已經試過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 

而且一個元組(方法要慢):

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

是否有這樣做的任何其他性能友好的方式?

編輯:爲了清楚起見,我將它應用到一個有數千行的表格中。

回答

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) 

這可能會優化比「中」更好的版本。

+0

它會返回一個同樣的'ITEM_NO'多行。這是我首先要避免的。 – Ruel 2012-08-16 01:41:39

+0

@Ruel。 。 。我發現你的問題含糊不清。標題暗示了一件事,但另一個查詢示例。我終於明白了這一點。 – 2012-08-16 01:46:18

+0

對不起。修正了我的標題。 – Ruel 2012-08-16 01:48:29

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; 
相關問題