gpt4 book ai didi

mysql - MySQL Group By 中的动态条件

转载 作者:行者123 更新时间:2023-12-01 00:20:02 25 4
gpt4 key购买 nike

我有一个名为 viewlist 的表,如下所示

 Id            article_id           viewdate
--------------------------------------------------
1 1 2015-07-01
2 1 2015-07-01
3 1 2015-07-01
4 2 2015-07-01
5 2 2015-07-01
6 1 2015-07-02
7 2 2015-07-02
8 1 2015-07-03
9 2 2015-07-03
10 1 2015-07-08
11 1 2015-07-08

我需要编写一个 MySQL 查询来通过对相邻的 viewdate 字段进行分组来获取计数和 article_id

想要的结果如下

article_id            count                   date_period
-----------------------------------------------------------------
1 4 2015-07-01 - 2015-07-02
2 3 2015-07-01 - 2015-07-02
1 3 2015-07-03 - 2015-07-08
2 1 2015-07-03 - 2015-07-08

是否有任何简单的查询可以得到这种类型的结果?

最佳答案

我原来的解决方案显然在变量初始化方面存在一些问题。

我猜下面的修正解决方案可以解决这个问题。

它使用了一个小 hack,这可能会在未来版本的 MySQL(-type)系统上失败,但如果需要的话它很容易变通 - 只需将子查询中的 HAVING 更改为 super 查询中的 WHERE 并添加一个 ORDER通过某处...

SELECT a.range_start
, a.range_end
, b.article_id
, COUNT(*) total
FROM
( SELECT x.viewdate range_start
, MIN(y.viewdate) range_end
, @i:=@i+1 i
FROM my_table x
JOIN my_table y
ON y.viewdate > x.viewdate
JOIN (SELECT @i:=0) vars
GROUP
BY range_start
HAVING MOD(i,2) = 1
) a
JOIN my_table b
ON b.viewdate BETWEEN a.range_start AND a.range_end
GROUP
BY article_id
, range_start;

http://www.sqlfiddle.com/#!9/d753f/3

作为对下面评论的回应,类似下面的内容可能是处理“未配对的”range_starts 的一种方式——但它没有经过测试……

SELECT a.range_start
, a.range_end
, b.article_id
, COUNT(b.article_id) total
FROM
( SELECT x.viewdate range_start
, COALESCE(MIN(y.viewdate),MAX(x.viewdate)) range_end
, @i:=@i+1 i
FROM my_table x
LEFT
JOIN my_table y
ON y.viewdate > x.viewdate
JOIN (SELECT @i:=0) vars
GROUP
BY range_start
HAVING MOD(i,2) = 1
) a
LEFT
JOIN my_table b
ON b.viewdate BETWEEN a.range_start AND a.range_end
GROUP
BY article_id
, range_start;

关于mysql - MySQL Group By 中的动态条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32246455/

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