2013-08-29 2 views
1

У меня есть таблица MySQL, которая имеет три колонки:Объединить дублироваться сообщения электронной почты и точки MySQL

Userid   | Email    | Points 
--------------------------------------------------------- 
1    | [email protected] | 20 
2    | jdoe%40company.com | 25 
3    | [email protected] | 14 
4    | rwhite%40company.com| 10 

То, что я хочу сделать, это удалить дубликаты электронной почты и слияния точек. Я хочу, чтобы мой стол выглядел так:

Userid   | Email    | Points 
--------------------------------------------------------- 
1    | [email protected] | 45 
3    | [email protected] | 24 

Как бы мой запрос напоминал о возврате моей таблицы желаний?

Кто-нибудь знает, как это сделать?

Заранее благодарен!

ответ

2

Вы ищете что-то вроде этого?

SELECT MIN(userid) userid, email, SUM(points) points 
    FROM 
(
    SELECT userid, REPLACE(email, '%40', '@') email, points 
    FROM table1 
) q 
    GROUP BY email 

Выход:

 
| USERID |    EMAIL | POINTS | 
|--------|--------------------|--------| 
|  1 | [email protected] |  45 | 
|  3 | [email protected] |  24 | 

Вот SQLFiddle демо


Теперь, если вы хотите дедуплицировать таблицу на месте вы можете сделать

-- Fix emails 
UPDATE table1 
    SET email = REPLACE(email, '%40', '@') 
WHERE email LIKE '%\%40%'; 
-- Merge points for duplicate records 
UPDATE table1 t JOIN 
(
    SELECT email, SUM(points) points 
    FROM table1 
    GROUP BY email 
    HAVING COUNT(*) > 1 
) q ON t.email = q.email 
    SET t.points = q.points; 
-- Delete all duplicate records except ones with lowest `userid` 
DELETE t 
    FROM table1 t JOIN 
(
    SELECT MIN(userid) userid, email 
    FROM table1 
    GROUP BY email 
    HAVING COUNT(*) > 1 
) q ON t.email = q.email 
WHERE t.userid <> q.userid; 

Вот SQLFiddle демо

+0

@AndyMartin ли это помочь? – peterm

0

Используйте этот запрос если вы хотите, чтобы соответствовать по электронной почте, как это без каких-либо изменений

SELECT MIN(user_id), SUM(points)as points, email FROM table_name GROUP BY email