mysql - 您能否告诉我,我用来检索客户上次下订单时间的信息的查询出了什么问题?

标签 mysql sql

我正在尝试在 MySQL 工作台上编写一个查询,该查询显示客户上次从我客户的网站订购的时间。为此,我使用了两个表。一个称为“订单”,每当下达新订单时,它就会根据订单时间进行更新,并为每个新订单分配一个唯一的 ID。另一个表称为“orders_customers_details”,每当下新订单时也会更新该表,并包含下订单的客户的唯一 ID(基于客户的电子邮件地址和电话号码的组合)以及一个 key 对应订单表的id。

我的问题是我使用的查询没有返回每个客户的最新订单。对于某些客户,我会得到他们第四或第五个最近订单的日期。

我要在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 随着每个新订单的下达而增加,因此 id 最高的订单是最近的订单。

我也尝试过

 SELECT customer_id, MAX(order.id) 

然后按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;

最佳答案

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;

关于mysql - 您能否告诉我,我用来检索客户上次下订单时间的信息的查询出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405072/

相关文章:

php - Laravel 搜索引擎使用查询,但问题是它不准确

java - JPA 在 MySQLIntegrityConstraintViolationException 中插入父/子结果

mysql - e 标志和特殊字符在 mysql 中起什么作用?

MySQL转换为日期时间语法错误: unexpected IDENT_QUOTED

mysql - SQL 查询以查找具有相同电子邮件域的最大计数

php - PDO错误: SQLSTATE[HY000]: General error: 2031

c# - Entity Framework 6 Visual Studio 2015 Mysql 问题

mysql - 使用utf8编码的mysql中的字符串值错误

sql - 如何从第一行开始更新表列的行?

mysql - 如何使用 HTTP POST 为 SQL 数据库设置正确的主键?