mysql使用group by多次连接同一个表

时间:2018-05-28 10:05:20

标签: mysql left-join

我有表productsidnameprice,...)和productStatsproductId,{{1 }},timeunitsSold,...)。

unitsReserved中,我们每分钟都有一行,以及该特定分钟的所有必要汇总值。如果我们需要获得一个时期的统计数据,那就可以了:

productStats

但是当我们想要同时获取多个时段的聚合值时,我们遇到了错误(错误的值):

select 
    id,
    name,
    SUM(lastDay.unitsSold) as latDayUnitsSold,
from `products`

left join 
    `productStats` as `lastDay` 
    on `products`.`id` = `lastDay`.`productId` 
    and `lastDay`.`time` between '2018-05-27 00:00:00' and '2018-05-28 00:00:00'

group by `products`.`id`

我们如何多次加入同一个表,但具有不同的日期时间范围,并且每个表都有单独的总和列?

2 个答案:

答案 0 :(得分:0)

尝试使用OR

在同一个连接表中添加所有不同的条件
select 
    id,
    name,
    SUM(lastDay.unitsSold) as latDayUnitsSold,
    SUM(lastMonth.unitsSold) as latMonthUnitsSold,
    SUM(lastYear.unitsSold) as latYearUnitsSold,
from `products`

left join 
    `productStats` as `lastDay` 
    on `products`.`id` = `lastDay`.`productId` 
    and 
    (
     `lastDay`.`time` between '2018-05-27 00:00:00' and '2018-05-28 00:00:00'
      OR
     `lastDay`.`time` between '2018-04-28 00:00:00' and '2018-05-28 00:00:00'
      OR 
      `lastDay`.`time` between '2017-05-28 00:00:00' and '2018-05-28 00:00:00'
    )
group by `products`.`id`

答案 1 :(得分:0)

您可以使用单个连接操作

在不同的时间范围内使用条件聚合
SELECT 
    p.id,
    p.name,
    SUM(CASE WHEN `lastDay`.`time` BETWEEN '2018-05-27 00:00:00' AND '2018-05-28 00:00:00' THEN lastDay.unitsSold ELSE 0 END) AS latDayUnitsSold,
    SUM(CASE WHEN `lastDay`.`time` BETWEEN '2018-04-28 00:00:00' AND '2018-05-28 00:00:00' THEN lastDay.unitsSold ELSE 0 END) AS latMonthUnitsSold,
    SUM(lastDay.unitsSold) AS latYearUnitsSold,
FROM  `products` p
LEFT JOIN
    `productStats` AS `lastDay` 
    ON p.`id` = `lastDay`.`productId` 
    AND `lastDay`.`time` BETWEEN '2017-05-28 00:00:00' AND '2018-05-28 00:00:00'
GROUP BY p.id, p.name