首先,我在 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
Run Code Online (Sandbox Code Playgroud)
我需要做的是从该表中获得最长的连续记录Days
。
所以在上面的例子中,最长的条纹是4 days
。
我发现了这个:https://dzone.com/articles/how-to-find-the-longest-consecutive-series-of-even
它解释了他想要做的事情,这与我想要实现的目标相似,但它的解释/写得如此糟糕,以至于我无法理解它。
我还需要找到这些日期之间的差距并重新开始计算连续数。因此,在上面的示例中,由于日期之间存在间隙,因此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)
Run Code Online (Sandbox Code Playgroud)
第二次编辑:
根据以下答案尝试了以下内容,但我什么也没得到:
$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;
Run Code Online (Sandbox Code Playgroud)
第三次编辑:
以下代码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;
Run Code Online (Sandbox Code Playgroud)
第四次编辑:
我不确定下面的答案是否经过测试,但它对我不起作用。
我尝试了以下操作,尽管没有收到错误,但我只看到一个空白页面,这意味着代码无法正常工作:
$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];
Run Code Online (Sandbox Code Playgroud)
考虑以下...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,val INT NOT NULL
);
INSERT INTO my_table VALUES
(1 , 11),
(2 , 11),
(3 , 12),
(4 , 13),
(5 , 14),
(6 , 17),
(7 , 18),
(8 , 20),
(9 , 21),
(10 , 22);
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 val FROM my_table ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY val
) a
GROUP
BY i
ORDER
BY max_streak DESC LIMIT 1;
+------------+
| max_streak |
+------------+
| 4 |
+------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您使用日期,那么逻辑是相同的,但您只需替换一些日期算术......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,val DATE NOT NULL
);
INSERT INTO my_table VALUES
(1 , '2018-11-11'),
(2 , '2018-11-11'),
(3 , '2018-11-12'),
(4 , '2018-11-13'),
(5 , '2018-11-14'),
(6 , '2018-11-17'),
(7 , '2018-11-18'),
(8 , '2018-11-20'),
(9 , '2018-11-21'),
(10 , '2018-11-22');
SELECT COUNT(*) max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = val - INTERVAL 1 DAY THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=val
FROM
( SELECT DISTINCT val FROM my_table ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY val
) a
GROUP
BY i
ORDER
BY max_streak DESC LIMIT 1;
+------------+
| max_streak |
+------------+
| 4 |
+------------+
Run Code Online (Sandbox Code Playgroud)
纯粹主义者会(正确地)认为我以错误的方式使用 @variable 赋值 - 但这只是我养成的一个坏习惯。也就是说,我认为正确的分配方法如下,但毫无疑问,如果我错了,有人会告诉我......
SELECT COUNT(*) max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = val - INTERVAL 1 DAY THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=val
FROM
( SELECT DISTINCT val FROM my_table ORDER BY val ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
) a
GROUP
BY i
ORDER
BY max_streak DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
如果你想将它捆绑在一些 PHP 中,我想它可能看起来像这样(尽管从接下来的内容中可以明显看出应用程序代码并不是我的强项)...
<?php
require('path/to/connection/stateme.nts');
$query = "
SELECT COUNT(*) max_streak
FROM
( SELECT x.*
, CASE WHEN @prev = val - INTERVAL 1 DAY THEN @i:=@i ELSE @i:=@i+1 END i
, @prev:=val
FROM
( SELECT DISTINCT val FROM MY_TABLE ORDER BY val ) x
JOIN
( SELECT @prev:=null,@i:=0 ) vars
) a
GROUP
BY i
ORDER
BY max_streak DESC
LIMIT 1;
";
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
$row = mysqli_fetch_assoc($result);
print_r($row);
?>
-- outputs
Array ( [max_streak] => 4 )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1247 次 |
最近记录: |