2012-05-24 47 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