PHP比较运算符在MySQL条纹查询中不起作用
Posted
技术标签:
【中文标题】PHP比较运算符在MySQL条纹查询中不起作用【英文标题】:PHP comparison operator not working in MySQL streak query 【发布时间】:2015-09-03 19:10:51 【问题描述】:在尝试计算单个球员的最长连续进球数时,我遇到了一个绊脚石,>=
php 运算符没有按预期执行。
数据以表格形式呈现如下:
日期 gls ---------------------- 1980-08-16 2 1980-08-19 1 1980-08-23 1 1980-08-26 0 1980-08-30 1 1980-09-06 2 1980-09-13 0 ... 等等我使用的 PHP 查询如下:
SELECT gls, MIN(date) as StartDate, MAX(date) as EndDate, COUNT(*) as Games
FROM (SELECT gls, date,
(SELECT COUNT(*)
FROM goalsengine G
WHERE G.gls <> GE.gls
AND G.date <= GE.date) as RunGroup
FROM goalsengine GE) A
WHERE gls>='1'
GROUP BY gls, RunGroup
ORDER BY Games
我以这种方式形成查询,相信>=
会统计该球员在一场比赛中打进一个或多个进球的连胜纪录。例如,从上表中,前三个条目代表三场比赛的得分。
相反,查询返回的是连续得分,但仅在得分达到一定数量的情况下,即尽管在前三场比赛中得分,但在返回连续得分时忽略第一个条目(得分为两球,而不是一球)。
要返回结果,我使用以下内容:
while($row=mysql_fetch_assoc($result))
$startrundate = date("d F Y",strtotime($row['StartDate']));
$endrundate = date("d F Y",strtotime($row['EndDate']));
echo "<tr>";
echo "<td>".$row['Games']."</td>";
echo "<td class='tableprofile' style='text-align:right;'>".$startrundate." - ".$endrundate."</td>";
echo "</tr>";
$rowCount += 1;
相比之下,WHERE gls='0'
给了我想要的非进球记录。我觉得我可能忽略了一些简单的东西,但看不到什么。
【问题讨论】:
只是一个建议,但您是否考虑过在 GROUP BY 之后使用 HAVING 来过滤您的“gls”。类似GROUP BY gls, RunGroup HAVING gls >= 1 ORDER BY Games
你问的 PHP 代码在哪里?
我没有考虑过@MaggsWeb,但它对输出没有影响。
@Barmar,如果这就是你所指的,我已经用更多细节修改了这个问题?
我猜最后一行应该是 1980-09-13 而不是 1980-08-13,所以日期在不断增长
【参考方案1】:
我已经设法为这个特定问题制定了一个解决方案,并且据我所知,它可以手动计算出一些原始数据。
SELECT gls, MIN(date) as StartDate, MAX(date) as EndDate, COUNT(*) as Games
FROM (SELECT gls, date,
(SELECT COUNT(*)
FROM goalsengine G
WHERE IF(G.gls IN ('1','2','3','4','5'),1,0) <> IF(GE.gls IN ('1','2','3','4','5'),1,0)
AND G.date <= GE.date) as RunGroup
FROM goalsengine GE) A
WHERE gls IN ('1','2','3','4','5') GROUP BY IF(bg IN ('1','2','3','4','5'),1,0), RunGroup ORDER BY Games DESC LIMIT 3");
我承认它并不完全漂亮,但它现在正在做这项工作。我在计算中选择了 5,因为这是就该数据集而言,单场比赛的最大进球数。
【讨论】:
以上是关于PHP比较运算符在MySQL条纹查询中不起作用的主要内容,如果未能解决你的问题,请参考以下文章