mysql - 获取一天的不同记录,但在日期范围内对它们进行多次计数

标签 mysql sql

我正在处理一个查询,其中我正在搜索订单号。我需要过滤当天唯一的订单号。为此,我在主查询中使用了 count(distinct order_number) 。此查询从前端获取开始和结束日期并使用它们。但是我有一个问题,如果在该范围内 2 天有相同的 order_number ,那么这两天都会被计算在内。 IE。 计算一天的唯一订单数。最初我想对日期使用一些循环并对结果求和,但这对我来说看起来不正确。我更感兴趣的是使用相同的查询并根据日期修改它以获取不同的订单。这是我的查询:

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS DATE,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY DATE

示例

假设在 8 月 29 日,我有订单 o1、o2、o1、o3、o2,我会将它们算作 3 个不同的订单,即 o1、o2、03 8 月 30 日,我有订单 o1、o4、o4、o1,我将它们算作 2 个不同的订单,即 o1、o4

但是当我查询 8 月 29-30 日时,我必须得到 3+2 = 5 的计数,即 o1 在范围内被计数两次,它属于两个不同的日期。

最佳答案

我认为在这种情况下,WITH ROLLUP修饰符可能会满足您的目的

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS `DATE`,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY `DATE` WITH ROLLUP

这会在数据末尾添加一行,对 total_orders 数据进行求和(DATE 为 NULL 值)

以下是有关此修饰符的文档:http://dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html

关于mysql - 获取一天的不同记录,但在日期范围内对它们进行多次计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191308/

相关文章:

php - 使用递归函数在列表中将 SQL 帖子相互分组

mysql - 需要创建一个 View ,在 from 子句中没有子查询的情况下获得相同的结果

php - 如何获得for循环laravel中的数字总和

java - 'where clause' 中未知的列用户名

sql - 将列中的数据替换为 SQL 中的字符

php - 许多(许多)SQL JOIN 与多个查询

MySQL MATCH() 与 ()

mysql - Doctrine 子查询和 where

mysql - SQL从另一列的值创建一列

sql - T-SQL聚合函数逻辑错误