Можете ли вы сказать мне, что не так в запросе, который я использую для получения информации о том, когда клиент последний раз размещал заказ? - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь написать запрос на MySQL, который показывает, когда клиент последний раз заказывал с сайта моего клиента.Я использую две таблицы для этой цели.Один из них называется «заказы», ​​который обновляется со временем заказа при каждом размещении нового заказа и присваивает уникальный идентификатор каждому новому заказу.Другая таблица называется "orders_customers_details", которая также обновляется всякий раз, когда размещается новый заказ, и содержит уникальный идентификатор (на основе комбинации адреса электронной почты и номера телефона) клиента, разместившего заказ, а также ключ, которыйсоответствует идентификатору таблицы заказов.

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

Мне осталось присоединиться к заказам на orders_customer_details:

left join orders o
on ocd.id = o.customer_details_id

У меня естьтакже попытался использовать левое внешнее соединение и следующее соединение:

from orders o, orders_customers_details ocd
where o.customer_details_id = ocd.id

Чтобы получить только самый последний заказ, я группирую по customer_id HAVING max (order.id).К вашему сведению, order.id увеличивается с размещением каждого нового ордера, поэтому ордер с самым высоким идентификатором является самым последним ордером.

Я также попытался

 SELECT customer_id, MAX(order.id) 

, а затем сгруппировалby customer_id, но безрезультатно.

Вот весь код:

select customer_id, o.id as id_of_last_order, date(order_date) as 
last_ordered, timestampdiff(day, order_date, now()) as 
days_since_last_ordered
from orders o, orders_customers_details ocd
where o.customer_details_id = ocd.id
group by customer_id having max(o.id)
order by customer_id;

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Типичным методом в MySQL является использование коррелированного подзапроса для получения самого последнего порядка:

select ocd.customer_id, o.id as id_of_last_order, 
       date(o.order_date) as last_ordered,
       timestampdiff(day, o.order_date, now()) as days_since_last_ordered
from orders o join
     orders_customers_details ocd
     on o.customer_details_id = ocd.id
where o.order_date = (select max(o2.order_date)
                      from orders o2 join
                           orders_customers_details ocd2
                           on o2.customer_details_id = ocd2.id
                      where oc2.customer_id = ocd.customer_id
                     )
order by ocd.customer_id;

Конечно, если o.id - это автоинкрементный столбец, то наибольшее значение получается изсамая последняя дата.Если это так, то вы можете просто использовать агрегирование:

select ocd.customer_id,
       max(o.id) as id_of_last_order, 
       date(max(o.order_date)) as last_ordered,
       timestampdiff(day, max(o.order_date), now()) as days_since_last_ordered
from orders o join
     orders_customers_details ocd
     on o.customer_details_id = ocd.id
group by ocd.customer_id
order by ocd.customer_id;

В MySQL 8+ вы просто используете оконные функции:

select *
from (select ocd.customer_id, o.id as id_of_last_order, 
             date(o.order_date) as last_ordered,
             timestampdiff(day, o.order_date, now()) as days_since_last_ordered,
             row_number() over (partition by ocd.customer_id order by o.order_date desc) as seqnum
      from orders o join
           orders_customers_details ocd
           on o.customer_details_id = ocd.id
     ) ocd
where seqnum = 1
order by ocd.customer_id;
0 голосов
/ 01 июня 2019

Попробуйте это-

SELECT 
customer_details_id customer_id, 
MAX(o.id) AS id_of_last_order, 
MAX(order_date) AS last_ordered, 
TIMESTAMPDIFF(DAY, MAX(order_date), NOW()) AS days_since_last_ordered
FROM orders O
INNER JOIN orders_customers_details OCD
    ON O.customer_details_id = OCD.id
GROUP BY customer_details_id 
ORDER BY customer_details_id;
0 голосов
/ 01 июня 2019

Использование коррелированного подзапроса в предложении where, чтобы найти самый последний заказ по клиенту и приведение кода в порядок, затем что-то вроде этого

select customer_id, o.id as id_of_last_order, date(order_date) as last_ordered, 
        timestampdiff(day, order_date, now()) as days_since_last_ordered
from orders_customers_details ocd
join orders o on  o.customer_details_id = ocd.id
where ocd_id = (select max(ocd_id) from orders_customers_details ocd1 where ocd1.customer_id = ocd_customer_id);

Хотя я не могу быть уверен, без примеров определения таблиц и т. Д..

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