2015-08-16 4 views
0
SELECT DISTINCT d.customer_id, d.date_added FROM `order` d 
WHERE d.customer_id NOT IN (
    SELECT DISTINCT i.customer_id 
    FROM `order` i 
    WHERE i.date_added > '2015-02-15 14:00:00' 
) 
ORDER BY d.date_added DESC; 

Вышеуказанный запрос должен возвращать customer_id клиентов, которые не заказывали после 15 февраля 2015 года (я думаю). Но самая первая запись
17168, 2015-08-16 17:36:00MySQL Запрос не в другом запросе

Что я делаю неправильно?

Это ниже запрос

SELECT DISTINCT i.customer_id,i.date_added FROM `order` i 
WHERE i.date_added > '2015-02-15 14:00:00' 
ORDER BY i.date_added ASC; 

возвращает ожидаемый результат, т.е. список идентификаторов клиентов для размещенных заказов после 15 февраля

P.S. customer_id не может быть NULL

+0

быть очень осторожными при использовании 'не в', как вы можете получить неожиданное отнимающие много время, чтобы результаты отладки при работе с допустимостью пустым. Не говори, что это твоя проблема. – Drew

+1

Я предполагаю, что заказчик также заказал bevor the fe15. – Jens

+0

@Drew customer_id не может быть NULL. – OC2PS

ответ

0

Can customer_id или data_added be NULL? Попробуйте

SELECT DISTINCT d.customer_id,d.date_added 
FROM order d 
WHERE d.customer_id NOT IN 
(SELECT DISTINCT i.customer_id FROM order i 
WHERE i.date_added > '2015-02-15 14:00:00' 
and customer_id IS NOT NULL 
and i.date_added IS NOT NULL) 
ORDER BY d.date_added DESC; 

Редактировать

так, как вы написали ваш запрос получит Вас customer_ids с заказом, прежде чем '2015-02-15 14:00:00'. Но если заказчик заказал что-то после этой даты, они могут быть в наборе результатов.

Edit2

Почему бы не написать

SELECT DISTINCT customer_id, date_added 
FROM order 
WHERE date_added <= '2015-02-15 14:00:00' 
ORDER BY date_added DESC; 
+1

Нет, не может. В любом случае date_added уже имеет условие, поэтому NOT NULL не имеет значения. В любом случае я попробовал ваше предложение, но не работал. – OC2PS

+0

см. Мой обновленный ответ, полученный результат действителен. – Benvorth

+0

Помогите мне понять это. Я говорю MySQL, чтобы найти мне customer_id FROM order records, чтобы эти идентификаторы отсутствовали в заказах, размещенных после 15 февраля. Итак, как вы пришли к выводу, что заказ, размещенный 16 августа, является допустимым результатом? Что я должен сделать, чтобы исправить запрос? – OC2PS

0

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

SELECT o1.customer_id, o1.date_added 
FROM `order` o1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM `order` o2 
    WHERE date_added > '2015-02-15 14:00:00' 
    AND o1.customer_id = o2.customer_id 
) 
ORDER BY o1.date_added DESC; 
+0

Спасибо! Я не знаком с корреляцией, которая не существует. Не могли бы вы пройти через логику? – OC2PS

+0

@ OC2PS Конечно. «Не существует» (который действительно является отрицательным предикатом 'exists') возвращает true, если подзапрос, который он оценивает, возвращает любые данные. В подзапросе условие даты проверяется для каждого идентификатора клиента во внешнем запросе (это корреляция). Поэтому, если у клиента есть какой-либо заказ позже указанной даты, подзапрос вернет что-то, а «не существует» будет ложным и этот клиент будет исключен. – jpw

+0

@ OC2PS Если идентификатор клиента не может быть нулевым (как вы говорите), запрос с использованием 'not in' должен давать тот же результат. – jpw

0

Если вы хотите клиентов, которые не заказали с определенной даты, я бы просто использовал group by и having:

SELECT o.customer_id, MAX(o.date_added) as most_recent 
FROM `order` o 
GROUP BY o.customer_id 
HAVING MAX(o.date_added) <= '2015-02-15 14:00:00'; 
+0

Похоже, что серийный downvoter на свободе. –

+0

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

+0

@jpw. , , Я почти уверен, что все (или почти все) ответы были опущены. Это происходит время от времени. Если вы не пострадали, больше энергии для вас. –