选择具有重复数据的行

Eri*_*ope 2 mysql sql select join

我有一些MySQL表需要删除冗余数据.例如:

 id email            date       data...
 1  email1@gmail.com 2012-01-01 my_data
 2  email2@gmail.com 2012-01-01 my_data
 3  email1@gmail.com 2012-01-02 my_data
 4  email1@gmail.com 2012-01-02 my_data   (redundant)
 5  email2@gmail.com 2012-01-02 my_data
Run Code Online (Sandbox Code Playgroud)

我需要删除冗余行,但我想首先选择它们.我在StackOverflow上找到了这个,但它需要电子邮件地址

SELECT * 
FROM `my_table`
WHERE `id` IN (SELECT `id` 
               FROM `my_table` 
               where `email` = 'email1@gmail.com' 
               group by `date` 
               HAVING count(*) > 1)
Run Code Online (Sandbox Code Playgroud)

我可以像上面那样使用什么查询,在嵌入式查询中不使用WHERE限定符,这样我就可以完成所有电子邮件地址了?

查询可以是SELECT查询.我不介意在PHPMyAdmin中手动删除行.

Joh*_*Woo 7

DELETE FROM tableName
WHERE ID NOT IN
(
    SELECT minID
    FROM
    (
        SELECT email, date, MIN(id) minID
        FROM tableNAme
        GROUP BY email, date
    ) x
)
Run Code Online (Sandbox Code Playgroud)

或者通过使用 JOIN

DELETE a 
FROM tableName a
    LEFT JOIN (
            SELECT minID
            FROM (
                    SELECT email, DATE, MIN(id) minID
                    FROM tableNAme
                    GROUP BY email, DATE
                    ) y
            ) x
            ON a.ID = x.minID
WHERE x.minID IS NULL;
Run Code Online (Sandbox Code Playgroud)

以下查询仅为SELECT每个电子邮件日期重复行

SELECT a.*
FROM tableName a
        LEFT JOIN 
       ( 
         SELECT minID
        FROM
        (
          SELECT email, date, MIN(id) minID
          FROM tableNAme
          GROUP BY email, date
        )y
       ) x ON a.ID = x.minID
WHERE x.minID IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 约翰应该获得双倍积分,因为他完美地回答了这个问题并向我介绍了SQL Fiddle!真棒! (2认同)