如何使用多个子字符串和子查询优化此查询

时间:2012-05-24 07:05:25

标签: mysql optimization

好的,我现在在网站上工作,显示有关电子设备部件的信息。这些部分有时会得到修订。零件编号保持不变,但它们在零件编号上附加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 个答案:

答案 0 :(得分:1)

首先:为什么不将版本变量存储在单独的列中?这样你就不需要调用substring来首先提取它。如果你真的需要连接代码和版本,我觉得最后这样做很好。

然后在您的位置,我首先拆分代码和版本,然后在聚合查询中使用 max ,例如:

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;

注意:我还没有对此查询进行测试,因此您可能需要修复一些参数,例如子字符串索引。