【问题标题】:MySQL: selecting rows by two of three primary keysMySQL:通过三个主键中的两个选择行
【发布时间】:2016-12-16 03:56:48
【问题描述】:

我搜索的内容与 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

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

提前感谢您的任何建议!

【问题讨论】:

    标签: mysql select primary-key


    【解决方案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
    

    【讨论】:

    • 由于无法编辑我自己的评论,这里有第二条:哇,真快!很好的解释和工作! :) 第一个给出了我正在搜索的内容,第二个左连接将带有 NULL 的列添加到我的数据集中,这可能会干扰真实数据,不是吗?你错过了一个结束->(
    • 第二个我们可以只使用 A.* 而不是 * 并且空列消失。我添加了缺失的)空列不会干扰,但根据连接条件和 where 子句,它们始终为空。如此毫无意义,这就是我添加 A.* 的原因。请记住,我没有您的数据集,因此除非我们模拟数据,否则我们没有机会“测试”。
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2011-01-28
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多