2012-05-24 76 views
0

好的,我現在正在網站上工作,顯示有關電子設備部分的信息。這些部分有時會得到修訂。零件編號保持不變,但它們在零件編號後附加A,B,C等,因此「更高」的字母和更新。還添加了一個日期。所以表格看起來像這樣:如何使用多個子字符串和子查詢優化此查詢

------------------------------------------------------------ 
| Partcode  | Description  | Partdate   | 
------------------------------------------------------------ 
| 12345A   | Some description 1 | 2009-11-10  | 
| 12345B   | Some description 2 | 2010-12-30  | 
| 17896A   | Some description 3 | 2009-01-12  | 
| 12345C   | Some description 4 | 2011-08-06  | 
| 17896B   | Some description 5 | 2009-07-10  | 
| 12345D   | Some description 6 | 2012-05-04  | 
------------------------------------------------------------ 

我現在需要的是來自零件最新版本的數據。所以,在這個例子中,我需要:

12345D和17896B

,一些已建在我面前的東西在這個行查詢:

SELECT substring(Partcode, 1, 5) AS Part, 
     (
      SELECT pt.Partcode 
      FROM Parttable pt 
      WHERE substring(pt.PartCode, 1, 5) = Part 
      ORDER BY pt.Partdate DESC 
      LIMIT 0,1 
     ), 
     (
      SELECT pt.Description 
      FROM Parttable pt 
      WHERE substring(pt.PartCode, 1, 5) = Part 
      ORDER BY pt.Partdate DESC 
      LIMIT 0,1 
     ), 
     (
      SELECT pt.Partdate 
      FROM Parttable pt 
      WHERE substring(pt.PartCode, 1, 5) = Part 
      ORDER BY pt.Partdate DESC 
      LIMIT 0,1 
     ) 
FROM Parttable 
GROUP BY Part 

正如你就會明白,這個查詢是出奇速度慢,感覺效率很低。但我無法理解如何優化此查詢。

所以我真的很希望有人能幫忙。

在此先感謝!

PS。我正在研究MySQL數據庫,並且在任何人詢問之前,我無法更改數據庫。

+1

正常化PartcodePrefix,PartcodeSuffix中的部分代碼將是一個好的開始。 –

+0

@SalmanA:...如果他們可以更改數據庫。 – Jon

+0

@SalmanA正如我所說的,不能更改數據庫,否則這將是我會做的第一件事。 – Crinsane

回答

1

首先:爲什麼不將版本變量存儲在單獨的列中?這樣你就不需要調用substring來首先提取它。如果你真的需要將代碼和版本連接起來,那麼最好這樣做是一個好習慣。

然後在你的地方,我會先被分割的代碼和版本,只需在彙總查詢使用最大,如:

SELECT code,max(version) FROM 
    (SELECT substring(Partcode, 5, 1) as code, 
     substring(Partcode, 1, 5) as version 
    FROM Parttable 
) 
AS part 
GROUP BY code; 

注:我沒有測試此查詢,以便您可能需要修復一些參數,如子字符串索引。

+0

感謝您的幫助。我改變了查詢來處理我的數據,它有點作用。我得到了正確的零件代碼,所以這很好,但我也需要該零件代碼的描述,但是我得到了它遇到的第一個零件代碼的描述(使用相同的代碼) – Crinsane

+0

然後,您應該使用附加查詢級別使用INNER JOIN,請參閱:http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql – Alexis

+0

我擺弄一個與它一點點,並得到它的作品!執行時間從查詢的20秒變爲0.5秒!大!謝謝! – Crinsane