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

好的,我现在正在网站上工作,显示有关电子设备部件的信息。这些部分有时会得到修订。零件编号保持不变,但它们在零件编号后附加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数据库,并且在任何人询问之前,我无法更改数据库。

0
额外 编辑
意见: 1
标准化PartcodePrefix,PartcodeSuffix中的部分代码将是一个好的开始。
额外 作者 Salman A,
对不起,我错过了最后一点:)
额外 作者 Salman A,
@SalmanA正如我所说,不能改变数据库,否则这将是我会做的第一件事。
额外 作者 Crinsane,
@萨尔曼:如果他们能改变数据库。
额外 作者 Jon,

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;

注意:我没有测试过这个查询,所以你可能需要修复一些参数,比如子串索引。

0
额外
谢谢您的帮助。我改变了查询来处理我的数据,它有点作用。我得到了正确的零件代码,所以这很好,但我也需要该零件代码的描述,但是我得到了它所遇到的第一个零件代码的描述(使用相同的代码)
额外 作者 Crinsane,
我用它摆弄了一下,然后让它起作用了!执行时间从查询的20秒变为0.5秒!大!谢谢!
额外 作者 Crinsane,
然后,您应该使用INNER JOIN使用额外的查询级别获得所需内容,请参阅: stackoverflow.com/questions/612231/…
额外 作者 Alexis,
很好,不客气。
额外 作者 Alexis,