2016-12-15 89 views
1

我正在寻找的东西乔纳森在这个例子中搜索正好相反:MySQL的:选择行两三个主键

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

分解问题转化步骤:

伪逻辑:

  • 获取我们想要排除
  • 现在排除整个组数据集记录的数据集

步骤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) 

或自外连接的一个子集,速度较慢,但​​给人如果需要的话您可以访问其他详细信息子集。 (在这个例子中没有太多用处,但在其他情况下可能有用)

数据集的左连接显示那些匹配最大日期的数据集,所以其他所有记录都将为null,这是数据集,重新...

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 
+0

哇,这很快!很好解释和工作! :) –

+0

由于不能编辑我自己的评论,这里是第二个:哇,这很快!很好解释和工作! :)第一个给我的是我正在搜索的内容,第二个带有左连接的列将NULL添加到我的数据集中,这可能干扰真实数据,不是吗?你错过了一个关闭 - >(< - 在你的第一个解决方案的最后:) –

+0

第二个我们可以使用A. *而不是*和空列消失。并在缺失处添加)空列不会干扰,但基于连接标准和where子句,它们始终为空。如此毫无意义,这就是为什么我添加A. *。请记住,我没有数据集,所以我们没有机会“测试”,除非我们模拟数据。 – xQbert