【问题标题】:How to find/delete duplicated records in the same row如何查找/删除同一行中的重复记录
【发布时间】:2011-01-23 09:49:38
【问题描述】:

是否可以查询同一行是否有重复记录?

我试图找到一个解决方案,但我能找到的只是在列中检测到重复的字段,而不是在行中。

例如,假设我有一个包含行和项目的表格:

| id | item1 | item2 | item3 | item4 | item5 | upvotes | downvotes |
--------------------------------------------------------------------
| 1  |  red  | blue  |  red  | black | white |   12    |    5      |

所以我想看看是否可以进行查询以检测具有相同记录的字段(在本例中为红色)并删除它们,和/或如何重新设计我的结构以不允许重复。

谢谢。

【问题讨论】:

    标签: mysql duplicates row field


    【解决方案1】:

    重新设计:

    您可以重新设计布局,如下所示:

    | id | item |
    

    以 (id, item) 作为主键,这将禁止给定 id 具有两倍相同的 item

    所以数据将如下所示:

    | id | item |
    | 1  | red  |
    | 1  | blue |
    ...
    

    尝试再次插入| 1 | red | 会引发错误。

    无需重新设计:

    如果您不想更改布局,此查询将查找其中一个 fieldX 字段等于同一行的另一个 fieldX 的行:

    SELECT t.id FROM (select 1) dummy
    JOIN (SELECT id, item1 as item FROM table
          UNION SELECT id, item2 as item FROM table
          UNION SELECT id, item3 as item FROM table
          UNION SELECT id, item4 as item FROM table
          UNION SELECT id, item5 as item FROM table) t
    GROUP BY t.id
    HAVING count(*) < 5
    

    (假设您有 5 个 fieldX 列。)

    这实际上计算了每个id 的不同fieldX 值。如果计数与字段数不同,则存在重复。查询返回存在重复的行的 id。

    测试后你可以删除行

    DELETE FROM table WHERE id IN ( <the previous query here> )
    

    【讨论】:

    • 就像第二个问题一样,我的查询应该如何将其转换为这种结构?
    • 我添加了一个查询来检测其中一个 fieldX 字段等于同一行的另一个 fieldX 的行
    • @user576875;感谢您的回答,最后我决定重新设计表格,我必须制作一个 php 脚本来获取所有数据并通过简单的循环将其重新插入新表格中。
    猜你喜欢
    • 2011-09-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多