Выборка из двух таблиц на несоответствие значений

Bagration

Новичок
Выборка из двух таблиц на несоответствие значений

Доброго времени суток.

Столкнулся с такой проблемой. Есть 2 таблицы:

`order` (заказы) - поля `o_id`, `o_email`, `o_date`...

и

`user` (пользователи) - поля `u_id`, `u_email`...

Надо выбрать все заказы, емейла которых нету в таблице пользователей.

Запрос:
PHP:
SELECT `o_id`, `o_email` FROM `order` LEFT JOIN `user` ON `o_email` <> `u_email` WHERE `o_date` > "xxxxxx" GROUP BY `o_email` ORDER BY `o_date` DESC
Выдает полностью все результаты из таблицы заказов. Т.е. не отфильтровывает емейлы, которые содержатся в таблице пользователей.

Можно ли, все-таки, как-то извлечь нужные данные одним запросом ?
 

zerkms

TDD infected
Команда форума
ON o_email = u_email
...
WHERE ... AND u_id IS NULL

ps: у тебя группировка в запросе прописана по несуществующему полю.
pps: зачем группировка, если нет аггрегирующих функций?
ppps: зачем o_id, если o_email может быть несколько, но они будут сгруппированы?
 

Bagration

Новичок
ON o_email = u_email
...
WHERE ... AND u_id IS NULL
Почти работает. Только я не могу понять, почему так много записей выдается ?
В таблице заказов всего 3000 записей. В таблице пользователей - 700 записей.

А в результате запроса выдает 34 000 записей, если без группировки и 20 000 с группировкой по E-Mail. У меня вообще нету такого количества заказов в базе.

Хотя выборочная проверка полученных E-Mail вроде дает нужный результат. Пользователей с полученными E-Mail нет в таблице пользователей...


ps: у тебя группировка в запросе прописана по несуществующему полю.
Исправил. Просто когда переносил запрос, менял поля. Структуру не я разрабатывал, приходится работать с имеющейся. А названия полей в базе такие, например: order_last_date - которое всего лишь описывает дату+время заказа.

pps: зачем группировка, если нет аггрегирующих функций?
Есть. И их там очень много. И с очень не простыми формулами. Тем более, что даже без них, мне нужны уникальные E-Mail пользователей, которые что-либо заказывали, но не регистрировались.

ppps: зачем o_id, если o_email может быть несколько, но они будут сгруппированы?
Логично, по привычке написал. Спасибо.
 

zerkms

TDD infected
Команда форума
Почти работает. Только я не могу понять, почему так много записей выдается ?
В таблице заказов всего 3000 записей. В таблице пользователей - 700 записей.
в этом месте мы должны вам сострадать? ох-ах, какой вы бедный.
ну ёмаё, хотите помощи - внесите конкретику. код, запросы...
 

Bagration

Новичок
ну ёмаё, хотите помощи - внесите конкретику. код, запросы...
Вам выложить полный дамп базы ? Или может полный код ПХП ?

Куда еще конкретнее ?

Повторюсь:

Таблица ORDER - order_id, order_email, order_date
Таблица USER - user_id, user_email

Надо выбрать уникальные E-Mail адреса из таблицы ORDER + этих адресов не должно быть в таблице USER

Никаких PHP данных нету. Один запрос SQL и больше ничего.

[SQL]SELECT `order_email` FROM `order` LEFT JOIN `user` ON `order_email` = `user_email` WHERE `user_id` IS NULL GROUP BY `order_email` ORDER BY `order_date` DESC[/SQL]

Выдает уникальные E-Mail адреса, НО количество возвращаемых значений В 10 раз больше, чем самих записей в БД.
 

zerkms

TDD infected
Команда форума
запрос верный, только немного глупый в части
ORDER BY `order_date` DESC
этот запрос так как и озвучено.
убери группировку, сузь выборку и посмотри откуда же берутся "неожиданные" записи.
 
Сверху