【问题标题】:MySQL - Finding Duplicated Data from Two ColumnsMySQL - 从两列中查找重复数据
【发布时间】:2017-04-21 19:01:22
【问题描述】:

我有一个任意大的 MySQL 表,其中有重复的行,但是要确定哪些行是重复的,我需要匹配两列中的数据。修改后的sn-p表格如下。

mysql> select * from DATA_STATUS where METADATA_ID='6ac00785-abcd-3f4a-defg-12b8ed23abff';
+--------+------------+--------------------------------------+-------------+
| ID     | STATUS     |  METADATA_ID                         | METADATA_FK |
+--------+------------+--------------------------------------+-------------+
| 1      |          3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 2      |          3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 3      |          0 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 4      |          0 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 5      |          1 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 6      |          2 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+

我想对整个表进行选择,其中有多个相同的METADATA_ID,其中重复的METADATA_ID 行的STATUS 为 3。我知道如何在表中查询一列中的重复项,但我正在努力弄清楚如何匹配重复项和其他条件。

从示例数据来看,符合此条件的行 ID 是 1 和 2,但不是 3。


编辑:用于澄清和 TL;DR 条件的附加信息

重复的总体标准是STATUS=3METADATA_ID > 1,下面的sn-p 显示了符合此条件的行。

+--------+------------+--------------------------------------+-------------+
| ID     | STATUS     |  METADATA_ID                         | METADATA_FK |
+--------+------------+--------------------------------------+-------------+
| 1      |          3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+
| 2      |          3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |       1234  |
+--------+------------+--------------------------------------+-------------+

我希望查询在找到重复项时仅拉回包含IDSTATUSMETADATA_IDMETADATA_FK 是可选的)的一行,或者是所有重复项实例美好的。如果STATUS 不是3 或METADATA_ID 在表中仅存在一次,则数据不计为重复。

【问题讨论】:

    标签: mysql duplicates


    【解决方案1】:

    试试这个:

    select * 
    from yourtable
    where 
      status_id = 3 and 
      metadata_id in (
            select metadata_id 
            from yourtable
            where status_id = 3 
            group by metadata_id 
            having count(*) > 1
      );
    

    Working example

    如果不是所有行都是必需的,您可以使用这个简单的查询:

    select * from yourtable where status_id = 3 group by metadata_id having count(*) > 1;
    

    【讨论】:

    • 谢谢。我在实际表上尝试了以前的答案和更新的答案。第一个查询按预期工作,但更新的查询没有。看起来它没有检查重复的 metadata_id 值。
    • 第二个是检索所有重复的行(第 1 行和第 2 行),因为我认为这就是您要问的。也许我没有得到这个问题,你能从你提供的输入中提供一个示例输出吗?
    • 当然。我将编辑问题以澄清这一点,并添加一些额外的行以提供进一步的帮助。
    • 我现在已经进行了编辑。我也会试试你的更新建议。抱歉,我无法使用真实数据,因为它包含敏感信息。
    • 谢谢,上面的例子似乎很有魅力!第二个示例也证实并有助于查找那些 确实 重复的记录的 METADATA_ID 值,而无需拉回 所有 重复的行。
    【解决方案2】:

    假设您想要所有重复这些字段的记录:-

    SELECT some_table.ID, 
            some_table.STATUS, 
            some_table.METADATA_ID, 
            some_table.METADATA_FK
    FROM
    (
        SELECT STATUS, 
            METADATA_ID, 
            METADATA_FK
        FROM some_table
        WHERE status_id = 3
        GROUP BY STATUS, METADATA_ID, METADATA_FK
        HAVING COUNT(*) > 1
    ) sub0
    INNER JOIN some_table
    ON sub0.STATUS = some_table.STATUS
    AND sub0.METADATA_ID = some_table.METADATA_ID
    AND sub0.METADATA_FK = some_table.METADATA_FK
    

    我假设 metafata_fk 是记录唯一性的一部分

    【讨论】:

    • 非常感谢。我无法建议编辑,但我的 MySQL 客户端由于ON sub0.STATUS = some_table.STATUS, 行上的逗号而引发了错误。除此之外,查询通过了,但它似乎没有检查 STATUS 是否为 3,这是识别重复项的条件。
    • 完成了这些小问题。
    猜你喜欢
    • 2013-04-17
    • 2021-03-29
    • 2016-02-27
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多