当前位置: 首页 > 面试题库 >

MYSQL包含零项目计数的日期值

司寇书
2023-03-14
问题内容

我想计算购买总数以及随着时间的推移按item_id进行的购买。在此示例中,用户可以拥有一个商品,而这些商品可以由其他用户购买。所有者不能购买自己的物品。

我遇到的问题是如何在没有正整数计数的日子和没有购买的日子返回计数为“ 0”的结果。

这是我的桌子:

      items           |          items_purchased          | numbers |   dates
i_id  item_id user_id | p_id item_id  user_id     date    |   num   | datefield
  1      1       11   |  1      1         13   2009-01-11 | 1       | 2005-06-07
  2      2       12   |  2      1         14   2009-01-11 | 2       | 2005-06-08
  3      3       11   |  3      2         15   2009-01-12 | 3       | 2005-06-09   
                      |  4      3         16   2009-01-12 | ...     | ...
                      |  5      1         17   2011-12-12 | 1000    | 2015-06-07

这是我的MYSQL查询,购买user_id=11的商品总数:

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 
GROUP BY DATE(purchase_date)
//note this query **doesn't** make use of the numbers and dates tables b/c I don't know how to use them

结果如下:

counts    date
  2    2009-01-11
  1    2009-01-12
  1    2011-12-12

这是我想看到的:

counts    date
  2    2009-01-11
  1    2009-01-12
  0    2009-01-13
  0    ... // should be a row here for each day between 2009-01-13 and 2011-12-12
  1    2011-12-12
  0    ... // should be a row here for each day between 2011-12-12 and current date
  0    current date (2012-6-27)

这是我的MYSQL查询,用于限制item_id=1由拥有的购买总数user_id=11

SELECT COUNT(*) as counts, DATE(purchase_date) as DATE
FROM items_purchased 
JOIN items on items_purchased.item_id=items.item_id 
WHERE items.user_id=11 and items.item_id=1
GROUP BY DATE(purchase_date)

结果如下:

counts    date
  2    2009-01-11
  1    2011-12-12

与上述类似,这是我想看到的:

counts    date
  2    2009-01-11
  0    2009-01-12
  0    ... // should be a row here for each day between 2009-01-12 and 2011-12-12
  1    2011-12-12
  0    ... // should be a row here for each day between 2011-12-12 and current date
  0    current date (2012-6-27)

我以某种方式认为我需要合并numbersdates表,但是我不确定如何做到这一点。任何想法将不胜感激,

谢谢,蒂姆


问题答案:

为更正答案而编辑:

http://sqlfiddle.com/#!2/ae665/4

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, IFNULL(counts, 0), item_id FROM 
    dates a
LEFT JOIN 
    (SELECT COUNT(*) as counts, purchase_date,user_id,item_id 
     FROM items_purchased 
     WHERE item_id=1
     GROUP BY date(purchase_date),item_id )r 
ON date(a.datefield) = date(r.purchase_date) ;

以上查询基于以下假设:

  1. 表格日期包含要列出的日期范围内的连续日期。
  2. 不太确定项目表的用途。第二个查询是按item_purchased表的purchase_date和item_id分组。
  3. 计数是对特定日期购买的特定商品进行计数(与user_id无关)。

@timpeterson(OP)进行的更新非常感谢@Sel。 这是sqlfiddles,展示了我感兴趣的两个查询:

  1. 单个用户拥有的所有商品(例如user_id=11)的每日购买量:http://sqlfiddle.com/#!2 / 76c00 / 3
  2. 每天item_id=1拥有的购买次数user_id=11:http: //sqlfiddle.com/#!2 / 76c00 / 1

这是第二个链接的SQL代码,以防链接以某种方式损坏:

SELECT date_format(datefield,'%Y-%m-%d') AS DATE, 
IFNULL(countItem, 0), item_id
FROM dates a
LEFT JOIN 
(SELECT countItem, purchase_date,i.user_id,p.item_id FROM (
   SELECT count(*) as countItem, purchase_date,user_id,item_id 
   FROM items_purchased 
   GROUP BY date(purchase_date),item_id
   ) p 
 inner join items i
 on i.item_id=p.item_id
 WHERE p.item_id='1' and i.user_id='11' //just get rid of "p.item_id='1'" to produce the 1st query result
)r 
ON date(a.datefield) = date(r.purchase_date);


 类似资料:
  • 问题内容: 我创建了以下存储过程,该过程用于计算所选位置的特定范围之间每天的记录数: 但问题是结果没有显示零记录的日子,我很确定这与我的WHERE语句有关,不允许显示零值,但我不知道该如何解决这个问题。 预先感谢尼尔 问题答案: 不是WHERE子句,而是GROUP BY。简而言之,查询将仅返回存在的行的数据。这意味着当您根据时间戳记的日期进行分组时,只会返回有行的日期。SQL Server从上下文

  • 本文向大家介绍浅谈MySQL数据库中日期中包含零值的问题,包括了浅谈MySQL数据库中日期中包含零值的问题的使用技巧和注意事项,需要的朋友参考一下 默认情况下MySQL是可以接受在日期中插入0值,对于现实来说日期中的0值又没有什么意义。调整MySQL的sql_mode变量就能达到目的。 例子: 有一个用于记录日志的表 向日志表插入有意思的日期值 向日志表插入包涵0的日期值 以上这篇浅谈MySQL数

  • 问题内容: 我正在尝试计算表中的记录,并按日期将它们分组。我当前的查询如下所示: 这行得通,除了我还要数月不存在任何记录的计数。 谁能提供有关如何实现此目标的建议/建议? 问题答案: 在MySQL中执行此操作的最简单方法是创建一个名为的表,该表列出了您感兴趣的所有月份,并在表中使用LEFT JOIN。 但是,由于这主要是一个表示问题,因此通常很容易在您已经在运行的情况下运行查询并在客户端(例如PH

  • 问题内容: 我有一个数据集,,和。每个资源可以被多个项目利用。 我想统计每个季度使用资源的项目数量。 因此,如果项目在特定年份的Q1开始并在当年的Q3结束,而project2在Q2开始并在Q3结束,那么我想为Q2计数2个项目,因为在Q1期间,project1和project2都处于活动状态。 这是我的数据集: 这是我要寻找的结果: 问题答案: 使用理货单: 使用from的日期,生成所有季度及其开始

  • 我需要读取一个非常大的Excel文件,该文件既有日期编号,也有非日期编号。我发现的所有示例似乎都能做到这一点或那一点(将单元格标识为日期值或在恒定内存中读取文件)。 对于非常大的文件,唯一有效的解决方案是此处所述的StreamingReader方法(此处所述的其他示例要么不适用于我的文件格式,要么出现内存不足堆错误)。 用java读取大型Excel文件(500K行) http://poi.apac

  • 问题内容: 如何对包含可选NSdate的可选数组进行排序? 如何根据dateCompleted对数组排序? 问题答案: 您的排序功能可以结合使用可选链接和nil合并运算符: 这将对值上的项目进行排序,所有和和一起的项目都被视为“在遥远的过去”,以便在所有其他项目之前对其进行排序。 Swift 3的 更新(假设是):