Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL запрос для возврата возвратившихся клиентов / 3 сообщений из 3, страница 1 из 1
20.11.2013, 17:28:51
    #38471603
Alexander B.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос для возврата возвратившихся клиентов
Необходимо составить SQL запрос, который бы возвратил клиентов (id), сделавших заказ в указанном месяце (к примеру, Октябре) и которые, при этом условии, имели заказ в течении 3-ех предыдущих месяцев (к примеру, Июль, Август, Сентябрь).
К сожалению, я не могу прийти к решению, как это сделать одним запросом.

Временный вариант возвращает клиентов за месяц, а потом ищет их заказы в течении 3-ех предыдущих месяцев. Упрощенная структура и запросы выглядят так:
Имеются две таблицы: orders (заказы) и clients (клиенты)

1) Запрос возвращает заказы и клиентов за Октябрь 2013:
Код: plsql
1.
SELECT * FROM orders LEFT JOIN clients ON clients.id = orders.client_id WHERE MONTH(orders.date) = 10 AND YEAR(orders.date) = 2013



2) После этого, я с помощью цикла php проверяю, если каждый клиент из запроса 1) в отдельности делал заказ в течении 3-ех предыдущих месяцев:
Код: plsql
1.
SELECT * FROM orders WHERE client_id = N AND MONTH(date) BETWEEN 07 AND 09 AND YEAR(date) = 2013


Как понимаете, это довольно длинный цикл, который делает запрос для каждого клиента в отдельности.

Не могу додуматься до более элегантного решения, уверен, что существует. Как выполнить задачу одним запросом?
...
Рейтинг: 0 / 0
20.11.2013, 18:49:05
    #38471758
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос для возврата возвратившихся клиентов
Alexander B.Временный вариант возвращает клиентов за месяцДа ни хрена. Он возвращает ЗАКАЗЫ. Да, и клиентов тоже, но каждого столько раз, сколько у него заказов.
Да и это делает через задницу. За каким хреном там ЛЕВОЕ связывание? да ещё в таком направлении?

Alexander B.Как выполнить задачу одним запросом?
ну типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT c.* 
FROM orders o
JOIN clients c
ON c.id = o.client_id 
WHERE YEAR(o.date) = 2013
GROUP BY c.id
HAVING SUM(MONTH(o.date) = 10) > 0
AND  SUM(MONTH(o.date) IN (7, 8, 9)) > 0
...
Рейтинг: 0 / 0
21.11.2013, 14:51:20
    #38472981
Alexander B.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос для возврата возвратившихся клиентов
Спасибо большое, подогнал запрос под реальную ситуацию - показал результаты.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL запрос для возврата возвратившихся клиентов / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]