gpt4 book ai didi

mysql - 显示之间的所有日期,即使没有结果

转载 作者:IT老高 更新时间:2023-10-29 00:12:05 25 4
gpt4 key购买 nike

SELECT User_JoinDate, 
COUNT(User_ID)
FROM Users WHERE `User_JoinDate`
BETWEEN '2012-11-22' AND '2012-12-06'
GROUP BY User_JoinDate
ORDER BY User_JoinDate ASC"

我正在生成要在折线图中显示的数据。不幸的是,我不知道如何让上述查询显示 0 表示没有用户可能已注册的日期。所以目前我的输出可能是这样的:

2012-11-22 - 22012-11-25 - 4

但我想要的是

2012-11-22 - 22012-11-23 - 02012-11-24 - 02012-11-25 - 4

我目前确实有一个工作版本,它将 MySQL 结果存储到一个数组中,然后 PHP 循环遍历并填充空白。这看起来很困惑,我希望通过 MySQL 有一个解决方案。我对该站点进行了很好的搜索,但很难理解其中的一些实现。有什么建议么?

最佳答案

您可以使用 MySQL 变量为您想要的所有日期构建一个自动结果集。

select
AllDaysYouWant.MyJoinDate,
count( U.User_ID ) as NumberJoined
from
( select
@curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
from
( select @curDate := '2012-11-21' ) sqlvars,
Users
limit 18 ) AllDaysYouWant
LEFT JOIN Users U
on AllDaysYouWant.MyJoinDate = U.User_JoinDate
group by
AllDaysYouWant.MyJoinDate

内部查询,我只是在没有键的情况下加入 users 表,所以它只是用来循环通过 X 条记录来表示你想要的天跨度......这可能是 30、100 等等...... .. 只要一张表(在本例中为用户),就有您期望的尽可能多的记录。

那么,只有天数的结果被加入到用户表中,但这一次,基于用户的 JOIN_DATE。简单的 COUNT() 应该可以得到你想要的。

“AllDaysYouWant”是分配给内部第一部分查询的别名

  ( select
@curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate
from
( select @curDate := '2012-11-21' ) sqlvars,
Users
limit 18 ) AllDaysYouWant

这基本上说明...从用户表(但可以是任何),给我 18 行数据(通过限制,但几乎可以是任意数量的记录,但您只需要从 11 月 22 日到 12 月 6 日,这只有 14 天,但我做了 18 天,原则上它几乎可以是任何东西。用户表上方是 (select @curDate := '2012-11-21') sqlvars。查询中包含的任何选择语句作为表源的括号必须有一个别名,因为它只是一个我将使用的变量,所以不管它的名字是什么。所以,这个查询在 11 月 21 日开始变量,并且 Select @curDate := Date_Add ...blah blah 声明取@curDate 的当前值,向其添加 1 天(现在变为 11 月 22 日)并将其存储在返回的行“MyJoinDate”中。所以现在,这个内部查询创建了你的日期表从 11 月 22 日起向前 18 天的数据,并具有别名“AllDaysYouWant”供查询的其余部分引用。

我已将您可能遇到的查询调整为 alias.field all 以进行澄清...

关于mysql - 显示之间的所有日期,即使没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com