2013-10-01 3 views
1

Это должно быть довольно легко, но я просто не могу понять это.выберите, где поле содержит более двух не дублированных записей sql

Получил таблицу с информацией о заказе клиентов. В этой таблице есть поле, называемое customers_email_address и customers_id, а также ряд других несущественных полей. Мне нужно найти разные записи, где записи в поле customer_email_address отличаются друг от друга, но уникальны для одного и того же customer_id. Другими словами, мне нужно выяснить, какие клиенты изменили свой адрес электронной почты в своем аккаунте с момента создания своей учетной записи, чтобы я мог обновить мою электронную почту с новым адресом электронной почты. Что-то, о чем я не думал, когда сайт был разработан!

Может быть примером может быть:

customers_ID customers_email_address 
1    [email protected] 
2    [email protected] 
1    [email protected] 
2    [email protected] 
1    [email protected] 
2    [email protected] 
3    [email protected] 
3    [email protected] 
3    [email protected] 

результат запроса должен выглядеть следующим образом:

customers_id customers_email_address 
1    [email protected] 
1    [email protected] 
2    [email protected] 
2    [email protected] 

только возвращение, где поле customers_email_address имеет многооконный повторяющиеся записи, но такой же customer_id

Возможно, что-то лучше будет выглядеть так:

customers_id customers_email_address1  customers_email_address2 
1    [email protected]   [email protected] 
2    [email protected]  [email protected] 

Надеюсь, это имеет смысл. Если у вас есть идея лучше, не стесняйтесь звонить.

В любом случае, спасибо за помощь.

+4

Пожалуйста, покажите ваш текущий запрос и структуры таблицы. Предварительно с помощью sqlfiddle – Wolph

ответ

2

UPDATE: Вы можете сделать это, как этот

SELECT DISTINCT o.customers_id, o.customers_email_address 
    FROM orders o JOIN 
(
    SELECT customers_id 
    FROM orders 
    GROUP BY customers_id 
    HAVING COUNT(DISTINCT customers_email_address) > 1 
) q 
    ON o.customers_id = q.customers_id 
ORDER BY o.customers_id; 

Выход:

 
| CUSTOMERS_ID | CUSTOMERS_EMAIL_ADDRESS | 
|--------------|-------------------------| 
|   1 |  [email protected] | 
|   1 | [email protected] | 
|   2 |  [email protected] | 
|   2 |  [email protected] | 

Вот SQLFiddle демо

+0

Думайте, что вы, возможно, ударились о гвоздь на голову петармы! Ты восхитителен. Благодаря! –

+0

сделаю. Должен подождать несколько, похоже. –

0

Это вернет две колонки customers_email_address1 и customers_email_address2 и быстро, потому что он может использовать покрытие i NDEX

SELECT 
orders1.customers_ID 
, orders1.customers_email_address "customers_email_address1" 
, orders2.customers_email_address "customers_email_address2" 
FROM 
orders orders1 

INNER JOIN 
orders orders2 

ON 
orders1.customers_ID = orders2.customers_ID 
AND 
    orders1.customers_email_address != orders2.customers_email_address 

GROUP BY 
orders1.customers_ID 

; 

см http://sqlfiddle.com/#!2/b1c8e/43

Или, если вам нужен денормализованный список (возможно, просто при обновлении из кода приложения), вы можете использовать это, и это должно быть очень быстро даже на больших таблицы, поскольку индекс накрытия используется

SELECT 
    customers_id 
    , GROUP_CONCAT(DISTINCT customers_email_address SEPARATOR '|') as emails 
    FROM orders 
    GROUP BY customers_id 
    HAVING COUNT(DISTINCT customers_email_address) > 1 

см http://sqlfiddle.com/#!2/b1c8e/41

Смежные вопросы