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 数据库,在有人问之前,我无法更改数据库。

4

1 回答 1

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;

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

于 2012-05-24T07:17:24.440 回答