Mysql

查詢最新版本的數據

  • April 23, 2013

mysql。

假設有一個包含欄位startdate和的表kind

實際上在此處命名的真正問題列中startdate並且kind在唯一索引中,但是如果只有startdate(not kind) 是唯一的情況也會很有趣。

指定日期d。我想檢索給定的數據,該數據kind對應於startdate之前的最新數據d

據我了解,這無法通過視圖有效地完成。

那麼,是否應該使用儲存過程來完成呢?我是儲存過程主題的新手。歡迎您的程式碼。

這很容易。

讓@d 為日期,@k 為種類:

select *
from table a
where 
 startdate = (select max(b.startdate) 
              from table b 
              where b.startdate < @d
              and b.kind = @k)
 and a.kind = @k

我想提出以下建議:

SUGGESTION #1:查詢如下

SET @GivenKind = '...';
SET @GivenDate = d;
SELECT * FROM table WHERE kind=@GivenKind
AND startdate < @GivenDate
ORDER BY startdate DESC LIMIT 1;

建議#2:定義一個好的索引

在你的問題中你說

實際上,在這裡命名的真正問題列中,startdate 和 kind 都在一個 UNIQUE 索引中,但是如果只有 startdate(不是 kind)是 UNIQUE 的情況也會很有趣。

對於我建議的查詢,您將需要一個索引來支持WHEREORDER BY

ALTER TABLE table ADD INDEX kind_startdate_ndx (kind,startdate);

這將極大地幫助查詢優化器。為什麼?

  • kind是查詢中的常數
  • startdate是在一個範圍內kind
  • 索引中列的順序很重要

如果此索引不存在,則可能導致範圍索引/表掃描或全索引/表掃描(如果kind的基數太低)。

擁有一個索引startdate,kind將導致範圍索引掃描。如果您指定kind.

試一試 !!!

引用自:https://dba.stackexchange.com/questions/40709