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

MySQL选择每月记录,即使数据不存在

卢景澄
2023-03-14
问题内容

我写了一个查询以获取用户表中的按月记录,如下所示

SELECT COUNT( `userID` ) AS total, DATE_FORMAT( `userRegistredDate` , '%b' ) AS
MONTH , YEAR( `userRegistredDate` ) AS year
FROM `users`
GROUP BY DATE_FORMAT( FROM_UNIXTIME( `userRegistredDate` , '%b' ) )

输出:

total      MONTH    year
---------------------------
3           May     2013
2           Jul     2013
--------------------------

预期产量:

total      MONTH    year
---------------------------
 0          Jan     2013
 0          Feb     2013
 0          Mar     2013
 0          Apr     2013
 3          May     2013
 0          Jun     2013 
 2          Jul     2013
--------------------------

即使数据不存在,我也需要显示记录。这个怎么做?


问题答案:

关于效率,我不会说太多,因为我没有针对其他方法进行过测试,但是如果没有临时表,这似乎是一个不错的选择。

   SELECT COUNT(u.userID) AS total, m.month
     FROM (
           SELECT 'Jan' AS MONTH
           UNION SELECT 'Feb' AS MONTH
           UNION SELECT 'Mar' AS MONTH
           UNION SELECT 'Apr' AS MONTH
           UNION SELECT 'May' AS MONTH
           UNION SELECT 'Jun' AS MONTH
           UNION SELECT 'Jul' AS MONTH
           UNION SELECT 'Aug' AS MONTH
           UNION SELECT 'Sep' AS MONTH
           UNION SELECT 'Oct' AS MONTH
           UNION SELECT 'Nov' AS MONTH
           UNION SELECT 'Dec' AS MONTH
          ) AS m
LEFT JOIN users u 
ON MONTH(STR_TO_DATE(CONCAT(m.month, ' 2013'),'%M %Y')) = MONTH(u.userRegistredDate)
   AND YEAR(u.userRegistredDate) = '2013'
GROUP BY m.month
ORDER BY 1+1;

如果您基于日期格式进行并集,甚至可以减少工作量和查询负担。

   SELECT COUNT(u.userID) AS total, DATE_FORMAT(merge_date,'%b') AS month, YEAR(m.merge_date) AS year
     FROM (
           SELECT '2013-01-01' AS merge_date
           UNION SELECT '2013-02-01' AS merge_date
           UNION SELECT '2013-03-01' AS merge_date
           UNION SELECT '2013-04-01' AS merge_date
           UNION SELECT '2013-05-01' AS merge_date
           UNION SELECT '2013-06-01' AS merge_date
           UNION SELECT '2013-07-01' AS merge_date
           UNION SELECT '2013-08-01' AS merge_date
           UNION SELECT '2013-09-01' AS merge_date
           UNION SELECT '2013-10-01' AS merge_date
           UNION SELECT '2013-11-01' AS merge_date
           UNION SELECT '2013-12-01' AS merge_date
          ) AS m
LEFT JOIN users u 
       ON MONTH(m.merge_date) = MONTH(u.userRegistredDate)
          AND YEAR(m.merge_date) = YEAR(u.userRegistredDate)
GROUP BY m.merge_date
ORDER BY 1+1;

两个查询的实时演示。



 类似资料:
  • 问题内容: 可以说我在mysql中有这两个表。 表格1: 表2: 然后,我有此查询以获取每个月的员工分析: 该查询将输出: 但是,如果我从查询中替换“ 2016-04-01”和“ 2016-07-31”之间的日期,则不会向我显示7月记录,因为它在表1中不存在,这不是我想要的。我仍然想得到这样的结果: 有人对此吗?请帮助我。谢谢! 问题答案: 考虑以下模式,其中第三个表是提到的年/月帮助程序表。He

  • 问题内容: 我有一个具有“约会表”和“服务表”的数据库。每个appt都有一个服务,每个服务都有一个价格。我想要的是一个查询,该查询将始终返回12行(每月一行),并包含几个月的总和(基于其服务ID)。到目前为止,我有: 当前,返回的内容如下: 问题是,如果一个月没有任何订单,我不会在查询中返回该月。我希望该月有一个记录,只是它的“ monthly_total”等于零。 以下是我希望查询返回的内容:

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

  • 问题内容: 所以我有这张表 现在,如果我查询 我期待类似的东西 是否有可能 ? PS:C行中的内容仅表示该列为空。 问题答案: 您可以创建一个嵌套表架构对象类型: 然后按以下方式构造查询: 例子: 结果:

  • 本文向大家介绍如何从MySQL数据库中选择随机记录?,包括了如何从MySQL数据库中选择随机记录?的使用技巧和注意事项,需要的朋友参考一下 为此,您可以使用ORDER BY RAND LIMIT。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是从MySQL数据库中选择随机记录的查询- 这将产生以下输出-

  • 问题内容: 我有一个mysql数据库,其中有一个TIMESTAMP字段,标题为date。如何选择月份为当前月份的所有字段? 提前致谢! 问题答案: 更新 一种更好的索引友好型查询日期范围内数据的方法 注意: 您不对列数据应用任何函数,而是在条件的右侧进行所有必要的计算(它们是常量,并且仅在执行后评估一次)。这样,您就可以使MySQL受益于该列上可能具有的索引。 原始答案: 注意: 尽管此查询产生正