2

削除する必要がある冗長データを含む 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

冗長な行を削除する必要がありますが、最初にそれらを選択したいと思います。これは StackOverflow で見つけましたが、メール アドレスが必要です

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

上記のように、埋め込みクエリで WHERE 修飾子を使用しないクエリを使用して、すべてのメール アドレスを分類できるクエリを教えてください。

クエリは SELECT クエリにすることができます。PHPMyAdmin で行を手動で削除してもかまいません。

4

2 に答える 2

7
DELETE FROM tableName
WHERE ID NOT IN
(
    SELECT minID
    FROM
    (
        SELECT email, date, MIN(id) minID
        FROM tableNAme
        GROUP BY email, date
    ) x
)

または使用して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;

次のクエリは、各電子メール日付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
于 2012-10-28T07:11:12.020 に答える
0

別のアプローチは、テーブル内の各電子メールアドレスの日付列の出現回数をカウントすることです。

SELECT `email`, `date`, COUNT(*) FROM `my_table` GROUP BY `date`, `email` HAVING COUNT(*) > 1

+------------------+---------------------+----------+
| email            | date                | COUNT(*) |
+------------------+---------------------+----------+
| email1@gmail.com | 2012-01-02 00:00:00 |        2 |
+------------------+---------------------+----------+
于 2012-10-28T07:50:25.777 に答える