这种类型的问题时不时被问到。提供的查询有效,但会影响性能。
我尝试过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
)
还有其他表现友好的方法吗?
编辑:要清楚,我将其应用于包含数千行的表格。
答案 0 :(得分: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”版本更好地优化。
答案 1 :(得分:0)
同样在MySQL中你可以使用用户变量(假设nbk_tabl.Item_no&lt;&gt; 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;