【问题标题】:select from multiple table with MAX and SUM [duplicate]从具有 MAX 和 SUM 的多个表中选择 [重复]
【发布时间】:2015-04-19 11:36:00
【问题描述】:

我需要在 MySql 数据库中查询客户数据。

我有客户表、订单和连接表。

我需要找到最后一次访问 - MAX(connection.date_add)

还有订单的总和。

我厌倦了一次查询 -

select MAX( connection.date_add), SUM(order.total_paid)
from customer 
join order on customer.id = order.c_id
join connection on customer.id = connection.c_id

问题是结果每个连接1行,订单数乘以连接数

我通过执行 3 次查询来解决它,然后“手动”合并结果

我的问题:是否可以在一个查询中完成?

我知道在其他 SQL 数据库中您可以使用 WITH 语句,但是在 MySql 中是否有一种简单的方法可以在一个查询中做到这一点?


无法添加答案 - 所以这是解决方案 -

SELECT c.id_customer, 
COUNT(DISTINCT  o.id_order ) AS '# VALID ORDERS', 
MAX( co.`date_add` ) AS last_visit,
SUM( o.total_paid )*COUNT(DISTINCT  o.id_order )/COUNT(co.`date_add` ) AS '$ (TOTAL AMOUNT)'
FROM ps_customer AS c
JOIN ps_orders o ON ( c.id_customer = o.id_customer ) 
JOIN ps_connections co ON co.id_customer = g.id_customer 
group by c.id_customer

内部子查询的解决方案也可以,但是太慢了。

Stackoverflow - 这不是重复的,请仔细阅读。

【问题讨论】:

  • 请使用示例数据和所需结果编辑您的问题。您想要每个客户一排还是整体一排?

标签: mysql


【解决方案1】:

您需要在join 之前使用子查询

select MAX(co.date_add), o.total_paid
from customer cu join
     (select c_id, sum(o.total_paid) as total_paid
      from order o
      group by c_id
     ) o
     on cu.id = o.c_id join
     connection co
     on cu.id = co.c_id

我猜您还想要group by cu.id,这样您就可以为每位客户获得一排。

事实上,我会预先聚合两个表:

select co.maxda, o.total_paid
from customer cu join
     (select c_id, sum(o.total_paid) as total_paid
      from order o
      group by c_id
     ) o
     on cu.id = o.c_id join
     (select co.c_id, max(co.date_add) as maxda
      from connection co
      group by co.c_id
     ) co
     on cu.id = co.c_id
group by cu.id;

【讨论】:

  • 答案不错,但是查询太慢了
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 2011-12-09
  • 2020-05-06
  • 2021-10-06
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多