2016-02-23 3 views
2

У меня есть следующий запрос MySQL.Удалите строки из набора результатов, который может содержать тот же адрес электронной почты

SELECT 
    login, 
    firstname, 
    lastname, 
    email 
FROM 
    xcart_customers 
WHERE 
    login LIKE 'anonymous%' 
AND email NOT IN (
    SELECT 
     email 
    FROM 
     xcart_customers AS cx 
    WHERE 
     cx.login NOT LIKE 'anonymous%' 
) 
GROUP BY 
    email; 

В основном есть два набора клиентов, клиентов, которые имеют логины и анонимных клиентов, которые все начинают с логином «анонимной%».

Я пытаюсь удалить не анонимных пользователей из списка, имеющих тот же адрес электронной почты, что и анонимные пользователи.

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

login   | firstname  | lastname  | email 
--------------------------------------------------------------------------- 
anonymous-10 | Eric   | Byorn  | [email protected] 
--------------------------------------------------------------------------- 
some_user_name | Eric   | Byorn  | [email protected] 
--------------------------------------------------------------------------- 

Так что я пытаюсь решить, все анонимные пользователи, которые появляются только в анонимных результатах.

+0

Вы можете поделиться некоторыми данными? – shmosel

+0

Хорошо, добавленные данные примера @shmosel – DevelumPHP

+0

Ваш запрос возвращает 0 строк с вашими примерными данными. Можете ли вы привести пример неожиданного результата? – shmosel

ответ

1

Наиболее эффективным, и ИМХО элегантное, решение заключается в использовании внешнего соединения:

SELECT 
    a.login, 
    a.firstname, 
    a.lastname, 
    a.email 
FROM xcart_customers a 
LEFT JOIN xcart_customers b ON b.email = a.email 
    AND b.login NOT LIKE 'anonymous%' 
WHERE a.login LIKE 'anonymous%' 
AND b.email IS NULL 

Там две основные трюки в игре здесь:

  1. Потому что пропустил ЛЕВЫЙ JOIN и вернуть все NULLs в левый присоединился стол, раздел WHERE исключает строки, которые имеют матч
  2. Все условия (даже без ключа) на присоединяемой таблицы должны быть в условии объединения, т.е. не в предложении WHERE, в противном случае efficively превратить внешнее соединение во внутреннюю один

Обратите внимание, что ваше использование GROUP BY является ошибочным и ненужным.

+0

Спасибо, человек, похоже, что это работает. – DevelumPHP

+0

За исключением того, что я все еще получаю повторяющиеся адреса электронной почты в результатах, если есть несколько анонимных строк от одного и того же клиента. – DevelumPHP

+0

Вы ничего не говорили о дубликатах. Работает ли 'SELECT DISTINCT ...'? Если нет, задайте новый вопрос (потому что на этот вопрос был дан ответ) – Bohemian