我正在寻找与Jonathan在这个例子中搜索的完全相反的东西:
How to select multiple rows by multi-column primary key in MySQL?
有3列作为主键(第3列是日期),我想在没有最新列的情况下选择所有列。如果前两个主要值的组合没有第二个条目,我根本不想选择它。把它想象成一种版本。表结构包含的列数多于这三列,我想选择整行。
看起来像这样:
{ID1 | ID2 | DATE} | more columns ...
伪代码:
SELECT * FROM table WHERE (first and second primary value are the same and exist more than once) AND NOT MAX(date)
:d
我想输出该行所有先前版本的数据,不包括最新版本的数据。
提前感谢任何建议!
答案 0 :(得分:1)
将问题分解为步骤:
伪逻辑:
步骤1:获取仅具有ID1,ID2
的最大数据的记录的数据集SELECT ID1, ID2, Max(date) date
FROM Table
GROUP BY ID1, ID2
步骤2:现在使用该数据集来识别/消除您不想要的记录......不存在可能是最快的。
更快...
SELECT A.*
FROM TABLE A
WHERE NOT EXISTS
(SELECT 1
FROM (SELECT ID1, ID2, Max(date) date
FROM Table
GROUP BY ID1, ID2) B
WHERE A.ID1 = B.ID1
and A.ID2 = B.ID2
and A.Date = B.Date)
或作为子集上的自外连接,速度较慢,但如果需要,您可以访问子集的其他详细信息。 (在这个例子中使用不多,但在其他情况下可能有用)
数据集的左连接显示了在最大日期匹配的数据集,因此所有其他记录都将为空,这是您之后的数据集...
SELECT A.*
FROM TABLE A
LEFT JOIN (SELECT ID1, ID2, Max(date) date
FROM Table
GROUP BY ID1, ID2) B
on A.ID1 = B.ID1
and A.ID2 = B.ID2
and A.Date = B.Date
WHERE B.ID1 is null