Оператор SQL для получения всех новых клиентов за определенный месяц - PullRequest
1 голос
/ 18 августа 2011

У меня есть база данных MySQL для электронной коммерции, в которой информация о заказах хранится в таблице «заказы».

Мне нужно выбрать всех НОВЫХ покупателей за март месяц.Клиентам не нужно регистрироваться для заказа, поэтому я работаю просто с электронной почтой клиента и датой времени заказа.Поэтому выберите все электронные письма клиентов, которые вообще не отображались в предыдущие месяцы.

Таблица базы данных содержит около 100 тыс. Строк, и я ищу эффективный запрос.

Я не являюсьслишком хорошо с SQL (вы, вероятно, можете сказать!), но это то, что у меня есть ...

SELECT distinct(user_email) FROM orders
WHERE order_datetime > '2011-03-01 00:00:00' 
      AND order_datetime < '2011-03-31 23:59:59' 
      AND user_email NOT IN (
          SELECT user_email FROM orders 
          WHERE order_datetime < '2011-03-01 00:00:00')
GROUP BY user_email

Это действительно запутанный способ делать вещи?:) Пожалуйста, дайте мне знать, если есть более эффективный способ ...

Спасибо, Рич

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Как насчет этого:

 SELECT user_email
 FROM orders     
 GROUP BY user_email
 HAVING MIN(order_datetime) BETWEEN '2011-03-01' AND '2011-03-31 23:59:59';
  • первый заказ в марте проверяется в предложении HAVING.
  • с индексом order_datetime поможет.
0 голосов
/ 18 августа 2011

Это довольно разумная реализация - хотя "group by" избыточен;DISTINCT не является агрегатной функцией (http://www.w3schools.com/sql/sql_groupby.asp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...