MySQL:通过三个主键中的两个选择行

时间:2016-12-15 19:21:44

标签: mysql select primary-key

我正在寻找与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

我想输出该行所有先前版本的数据,不包括最新版本的数据。

提前感谢任何建议!

1 个答案:

答案 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