好的,我现在在网站上工作,显示有关电子设备部件的信息。这些部分有时会得到修订。零件编号保持不变,但它们在零件编号上附加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)
首先:为什么不将版本变量存储在单独的列中?这样你就不需要调用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;
注意:我还没有对此查询进行测试,因此您可能需要修复一些参数,例如子字符串索引。