【发布时间】:2018-11-18 16:07:11
【问题描述】:
首先,我在 Google 和 Stackoverflow 上都发现了很多类似的问题,但我似乎无法掌握如何正确地做到这一点。
我有一个如下所示的表格:
id ms_date
------------------
1 2018-11-18
2 2018-11-18
3 2018-11-20
4 2018-11-22
5 2018-11-25
6 2018-11-26
7 2018-11-26
8 2018-11-27
9 2018-11-28
10 2018-11-29
我需要做的是从该表中获得Days 中最长的连胜记录。
所以在上面的例子中,最长的连续是4 days。
我发现了这个:https://dzone.com/articles/how-to-find-the-longest-consecutive-series-of-even
它解释了他想要做什么,这与我想要实现的目标相似,但是它的解释/写得非常糟糕,以至于我无法理解它。
我还需要找出这些日期之间的 GAP 并重新开始计算连续次数。同样在上面的示例中,由于日期之间存在间隔,Current Streak 应该是 3 Days。
我尝试使用上面链接中的代码,但它是基于 SQL 的,而且代码中有一些奇怪的 WITH 字词,根本没有意义。
有没有使用 PHP 和 Mysql 的简单方法来实现这一点?
有人可以就这个问题提出建议吗?
提前致谢。
编辑:
我似乎无法在我的 PHPMYADMIN 中找到软件版本,但这是我可以在数据库服务器部分看到的:
Server: Localhost via UNIX socket
Server type: MariaDB
Server connection: SSL is not being used Documentation
Server version: 10.0.37-MariaDB-0+deb8u1 - (Debian)
Protocol version: 10
User: freemind@localhost
Server charset: UTF-8 Unicode (utf8)
第二次编辑:
根据以下答案尝试了以下方法,但我一无所获:
$sql_COUNT = "SELECT COUNT(*) max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = val - 1 THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=val
FROM
( SELECT DISTINCT ms_date FROM MY_TABLE ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY ms_date
) a
GROUP
BY i
ORDER
BY max_streak DESC LIMIT 1";
$query_COUNT = mysqli_query($db_conx, $sql_COUNT);
$productCount_COUNT = mysqli_num_rows($query_COUNT); // count the output amount
echo $productCount_COUNT;
第三次编辑:
以下代码在我的页面上回显1,但基于我在MYSQL 数据库中的内容,它应该回显4:
$sql_COUNT = "SELECT COUNT(*) AS max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = ms_date - 1 THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=ms_date
FROM
( SELECT DISTINCT ms_date FROM MY_TABLE ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY ms_date
) a
GROUP
BY i
ORDER
BY max_streak DESC LIMIT 1";
$query_COUNT = mysqli_query($db_conx, $sql_COUNT);
$productCount_COUNT = mysqli_num_rows($query_COUNT); // count the output amount
echo $productCount_COUNT;
第四次编辑:
我不确定以下答案是否经过测试,但对我不起作用。
我尝试了以下操作,即使我没有收到任何错误,我也只看到一个空白页,这意味着代码不起作用:
$sql_COUNT = "SELECT COUNT(*) max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = ms_date - INTERVAL 1 DAY THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=ms_date
FROM
( SELECT DISTINCT ms_date FROM MY_TABLE ORDER BY ms_date ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
) a
GROUP
BY i
ORDER
BY max_streak DESC";
$query_COUNT = mysqli_query($db_conx, $sql_COUNT);
$count = mysqli_fetch_array($query_COUNT);
echo $count[0];
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。