首页 / MYSQL / mysql有可能吗?
mysql有可能吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql有可能吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4585字,纯文字阅读大概需要7分钟。
内容图文
![mysql有可能吗?](/upload/InfoBanner/zyjiaocheng/888/b4f0d29e36644c698033d23078cf06f7.jpg)
首先:对不起标题,但也许以后我会找到更好的标题.
几分钟前我问了这个问题,但是由于我无法描述我想要的内容,因此请再次尝试:)
这是我的表结构:
http://sqlfiddle.com/#!2/b25f9/37
该表用于存储用户会话.
在此基础上,我想生成一个堆积的条形图,该条形图应显示我有多少活跃用户.我的想法是,我会根据过去几天的在线时间对用户进行分组
让我们说它的星期五:
> B组:星期四(今天)在线的用户
> C组:星期四(星期三)之前(今天)不是在线的用户
> D组:周四或周三不在在线,但周二(和今天)在线的用户
>组E:不在周四,周三或周二但上周一,周日或周六(和今天)在线的用户
>组A:与其他组不匹配(但仅在今天)的用户
>我只想知道这些组(特定日期)的用户数
>用户只能属于这些组之一(同一天)
解决方法:
另一个更新:偶然地(通过复制和粘贴)具有starttime = …或starttime = …,但应为starttime = …或endtime = …
更新:
为了更详细地解释我的查询(在最终查询中还有更多评论):
首先我们只是得到了
SELECT
...
FROM gc_sessions s
WHERE DATE(starttime) = CURDATE() OR DATE(endtime) = CURDATE()
这无非是说“给我所有今天或今天结束会话的用户”.不得不一次又一次地考虑这两次,使得查询有点笨拙,但实际上并没有那么复杂.
因此,显然,通常我们将使用COUNT()函数对某事物进行计数,但是显然,由于我们需要“条件计数”,因此我们仅使用SUM()函数并告诉它何时加1,何时不加1.
SUM (CASE WHEN ... THEN 1 ELSE 0 END) AS a_column_name
SUM()函数现在检查从今天开始的会话结果集中的每一行.因此,对于该结果集中的每个用户,我们将查看该用户是否在指定的日期在线.不管他/她在线多少次,所以出于性能原因,我们使用EXISTS.使用EXISTS,您可以指定一个子查询,该子查询将在找到某项后立即停止,因此只要发现某项不为NULL,则返回的内容并不重要.因此,请不要混淆为什么选择1.在子查询中,我们必须将外部查询中当前正在检查的用户与内部查询(子查询)中的用户连接起来,并指定时间窗口.如果所有条件都满足,则计数1,否则返回0,如前所述.
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterday,
然后,我们为每个条件和一列创建一个列,您只需在一个查询中即可满足所有条件.因此,随着您更新的问题,您的条件已更改,我们只需要添加更多规则:
SELECT
/*this is like before*/
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndThursday,
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 2 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 2 DAY)))
/*this one here is a new addition, since you don't want to count the users that were online yesterday*/
AND NOT EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndWednesdayButNotThursday,
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 3 DAY) /* minus 3 days to get tuesday*/
OR (date(endtime) = CURDATE() - INTERVAL 3 DAY)))
/*this is the same as before, we check again that the user was not online between today and tuesday, but this time we really use BETWEEN for convenience*/
AND NOT EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndTuesdayButNotThursdayAndNotWednesday,
.../*and so on*/
FROM gc_sessions s
WHERE DATE(starttime) = CURDATE() OR DATE(endtime) = CURDATE()
所以,我希望你现在就明白.还有其他问题吗?随便问.
更新结束
回答先前版本的问题:
select
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterday,
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterdayOrTheDayBeforeYesterday,
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndWithinTheLastWeek
from gc_sessions s
where date(starttime) = CURDATE()
or date(endtime) = CURDATE()
内容总结
以上是互联网集市为您收集整理的mysql有可能吗?全部内容,希望文章能够帮你解决mysql有可能吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。