使用时间戳按天分组MySQL查询结果

33
我需要将以下查询取出每日的订单总数和订单总额,并按日期分组。 我使用时间戳存储所有数据。
SELECT
    COUNT(id) as order_count,
    SUM(price + shipping_price) as order_sum,
    DAY(FROM_UNIXTIME(created)) as day
FROM `order`
WHERE '.implode(' AND ', $where).'
我需要按天分组,但是当我对最近周末的销售进行分组时,它将我的订单数从3变为1。如何按天提取上述值?
注意:implode仅用于定义时间段(WHERE created> = TIMESTAMP AND <= TIMESTAMP)
更新:
未使用GROUP BY day
Array ( 
    [order_count] => 3
    [order_sum] => 69.70
    [day] => 17
)

按照day进行分组

Array ( 
    [order_count] => 1
    [order_sum] => 24.90
    [day] => 17
)

我需要这个查询返回每天的销售情况,订单数量和销售额总和。但我似乎还缺少一个关键部分....


我相信你需要提供一些数据 - GROUP BY 返回更多行并且聚合函数将按比例减少听起来非常正常。因此,请提供类似于样本输入数据,样本输出数据和期望输出的内容。 - Unreason
3个回答

49

你是否忘记在最后添加 GROUP BY ... 了?

SELECT
    COUNT(id) as order_count,
    SUM(price + shipping_price) as order_sum,
    DAY(FROM_UNIXTIME(created)) as order_day
FROM `order`
WHERE '.implode(' AND ', $where).'
GROUP BY order_day

注意:

你不能使用as day作为你的日期列,因为day是MySQL的一个函数。请使用类似于order_day的名称。

有关独角兽的

根据@OMG Unicorn的评论,您可以使用:

DAY(FROM_UNIXTIME(created)) as `day`

只要用反引号 `day包裹起来就可以了。


实际上,你可以使用名称“day”,只需要在它周围加上反引号即可。不幸的是,SO使用反引号来表示代码块,所以我不确定如何展示一个例子。 - Powerlord
1
DAY 给出了一个月中的日期。对于不同的日期,您应该使用 DATE(FROM_UNIXTIME(created)) - Semra
这个很老了,但是我想说它对我没用。 - tmarois

3
您也可以简单地使用:
SELECT 
COUNT( id ) AS order_count, 
SUM( price + shipping_price ) AS order_sum
FROM  `order` 
GROUP BY LEFT( timestamp, 10 ) 

甚至

按照日期的年月日(timestamp字段的前10个字符)进行分组


0
你可能遇到了一个命名冲突,DAY()(MySQL中的函数)和day(你的变量名)之间的冲突。你尝试过使用一些不会冲突的名称吗?比如order_day

1
我猜我在帖子中没有把注意文本放大。 - maček

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接