(MySQL) не могу написать SQL запрос

290
04 мая 2017, 13:17

Добрый день. Собственно не могу написать SQL запрос, особо не силен в этом, но появилась одна задача, собственно поэтому решил попросить помощи.

Имеется база данных, с двумя таблицами [customers] и [orders], в таблице [customers] содержится около 1 млн. записей, в таблице [orders] содержится около 1.5 млн. записей.

Структура таблицы [customers]: id, firstname, lastname, email, date_reg

Структура таблицы [orders]: id, customer_id, total, status, order_date

Собственно необходимо сделать две выборки:

  • TOP 500 [customers] за последний год, у которых нет ни одного [orders] где

[status] = success, сортировка по [date_reg].

  • TOP 500 [orders] созданных в будний день за последние 3 месяца вывести [order_id], [email], [date_order] сортировка по [date_order] заказа.

UPDATE Немного почитав, собрал такой запрос.

SELECT customers.id, 
       customers.firstname, 
       customers.lastname, 
       orders.status 
FROM customers 
INNER JOIN orders 
ON customers.id = orders.customer_id 
AND orders.status != 'success' 
AND customers.registration_date >= '2016-05-01' 
LIMIT 500;

В принципе он почти во всем меня устраивает кроме того что, по условию нужно вывести только клиентов у которых вообще не было ни единого "success" заказа. А в моем случае как я понял я вывожу все не "success" заказы клиентов, которые были зарегистрированы на протяжении прошедшего года.

Answer 1
  1. TOP 500 [customers] за последний год, у которых нет ни одного [orders] где [status] = success, сортировка по [date_reg]

    select c.id
    from customers c
        join orders o ON c.id = o.customer_id
    where date(date_reg) >= curdate() - interval 1 year /* за последний год */
    group by c.id
    having sum(if(status = 'success', 1, 0)) = 0 /* кол-во заказов со статусом success = 0 */
    order by c.date_reg desc
    limit 500
  2. TOP 500 [orders] созданных в будний день за последние 3 месяца вывести [order_id], [email], [date_order] сортировка по [date_order] заказа

    select o.id as order_id,
        c.email,
        o.order_date
    from orders o
        join customers c ON o.customer_id = c.id
    where date(order_date) >= curdate() - interval 3 month
        and dayofweek between 2 and 6 /* 1 - вс, 7 - сб */
    order by order_date desc
    limit 500
READ ALSO
Как создать партицию из запроса в MariaDB/MySQL

Как создать партицию из запроса в MariaDB/MySQL

Есть таблица которую надо партицироватьНо, ее критерий партицирования находятся в другой таблице

309
Скриншот фрагмента

Скриншот фрагмента

Как сделать скриншот фрагмента из активности?

256
Постоянная проверка интернета

Постоянная проверка интернета

Как в приложениях делают проверку интернета? Те

204