2016-08-18 2 views
0

申し訳ありませんが重複していますが、正確な回答を見つけるのが苦労しています...どのように私は合計し、重複するフィールドのMySqlを削除できますか?

私は 'email'(varchar)と 'clicks'(int)を含むテーブルを持っています。

電子メールフィールドには、電子メール値の複製インスタンスが含まれています。重複を削除して1つのインスタンスだけを保持したいと思いますが、その特定の電子メールインスタンスの「クリック」にあるすべての値を合計し、それを反映するために残りのレコードを更新したいと思います。

私はdistinctとgroup byを使用して、私が後にあるレコードのビューを取得できます。その合計と更新部分は私が困惑しています。

ありがとうございました。

+0

あなたは 'distinct'と' group by'を使うことができます。これは正しい道です。これらのことを試した場所で使用したコードを表示できますか? –

答えて

1

私はあなたがここにDISTINCTを使用する必要はないと思うが、むしろことができます各email値上だけのグループ、あなたが一緒に行くようにクリックの和をとる:

SELECT email, SUM(clicks) AS clickSum 
FROM yourTable 
GROUP BY email 

あなたは「残りの」言及します重複したレコードがどのように削除されたかについては言及しませんでした。 1つの重複したレコード以外のすべてを選択的に削除するのは、大変な作業です。

CREATE TABLE yourNewTable (`email` varchar(255), `clicks` int); 
INSERT INTO yourNewTable (`email`, `clicks`) 
SELECT email, SUM(clicks) 
FROM yourTable 
GROUP BY email 

DROP TABLE yourTable 
ALTER TABLE yourNewTable RENAME TO yourTable 
+0

それだけです。ありがとうTim。私はそれをあまりにも凝視していて、更新プログラムを追加する際にトンネルしました。結果を引っ張って集計し、一時テーブルに貼り付けて上書きする方がよいでしょう。 – RushVan

1

だけ多くの回のクリックでメールを更新:私はちょうど、新しいテーブルに上記のクエリを挿入し、古いテーブルを削除し、古いものに新しいものの名前を変更して、この程度行くかもしれません。

UPDATE yourTable a 
JOIN (SELECT email, 
      MAX(clicks) as m_clicks, 
      SUM(clicks) as s_clicks 
     FROM yourTable 
     GROUP BY email) b 
    ON a.email = b.email 
AND a.clicks = b.m_clicks 
SET a.clicks = b.s_clicks; 

その後DELETE

DELETE yourTable a 
LEFT JOIN yourTable b 
     ON a.clicks > b.clicks 
WHERE b.clicks is NOT NULL 

EDIT

私はちょうどあなたがクリックの数が同じ2つの行を持つことができます実現しています。そのため、常にID列をPKとして動作させる必要があります。

これで追加して重複をなくすことができます。

ALTER IGNORE TABLE yourTable 
ADD UNIQUE INDEX idx_clicks (email, clicks); 
+0

これは私が与えた答えに対する素晴らしい代替案です。 –

0

集計関数sum()とgroup byを使用できます。

SELECT email, sum(clicks) as sum FROM tableName group by email 
+0

これはティムアンサーとどう違うのですか? –

+0

私はこれを投稿した後でのみ、他の答えを見た。 –

関連する問題