Не используйте NOT IN ( SELECT ... )
. Он работает плохо и не работает так, как вам нужно в этом случае. Используйте LEFT JOIN
.
SELECT DISTINCT
o.`email`, o.`firstname`, o.`lastname`, o.`telephone`,
o.`ip`, NULL
FROM `order` AS o
LEFT JOIN ocustomer AS oc USING(email)
WHERE o.`customer_id` = 0
AND oc.email IS NULL
Выгодно:
order: INDEX(customer_id)
ocustomer: INDEX(email)
Это может быть даже лучше, тем более что оно «читается», как ваша формулировка проблемы:
SELECT DISTINCT
o.`email`, o.`firstname`, o.`lastname`, o.`telephone`,
o.`ip`, NULL
FROM `order` AS o
WHERE o.`customer_id` = 0
AND NOT EXISTS( SELECT 1 FROM ocustomer WHERE email = o.email )
Используя DISTINCT
вместо почти эквивалентного GROUP BY
,
- Избегает сообщения об ошибке.
- Он покажет вам, связано ли это письмо с несколькими именами, телефонами и т. Д.
(Примечание. Вопреки распространенному мнению, SELECT DISTINCT(a), b ...
не выглядит просто как "1023 *" как "отличающийся".)