计算列的出现次数

时间:2015-12-14 04:54:12

标签: php mysql

所以,如果我的标题有点混乱,我相信它是。顺便说一句,我正在为我的sql使用medoo API,所以这只是一个小信息,所以你不要对以下例子感到困惑。

示例表

+----+------------+----------------+-------------+
| id | playerName | infractionType | infractedBy |
+----+------------+----------------+-------------+
|  1 | Alpha      | ET1            | Admin       |
|  2 | Alpha      | ET1            | Admin       |
|  3 | Alpha      | ET1            | Admin       |
|  4 | Delta      | ET1            | Admin       |
|  5 | Echo       | ET1            | Admin       |
|  6 | Echo       | ET1            | Admin       |
|  7 | Delta      | ET1            | Admin       |
|  8 | Alpha      | ET1            | Admin       |
+----+------------+----------------+-------------+

好的,让我们回顾一下基础知识。如果你像这样做一个foreach循环:

foreach ($medoo->query("SELECT * FROM table1) as $entry) {
    echo $entry['playerName'];
}

因此您应该知道将打印出所有playerName。现在我想要的是打印出playerName的出现并回显出来。因此,对于非有序打印,代码将在这些行的某处:

foreach ($medoo->query("SELECT DISTINCT playerName FROM table1) as $entry) {
    echo $entry['playerName'];
    echo $medoo->count("infractions", ["playerName" => $entry['playerName']);
}

尽管如此“我没有订购”我想要的是订购它,我不知道如何这样做。我看了一遍谷歌看到了'count()'sql命令,但据我所知它对我来说基本没用。

我想知道的事情

  • 是否有符合我需求的SQL语句?如果是这样的话。
  • 如果SQL STATEMENT不可能,那么是否可以使用php创建排序? (我个人相信)。


当前代码

foreach ($GoldenData->query("SELECT DISTINCT playerName FROM infractions") as $player) {
foreach ($GoldenData->query("SELECT COUNT(playerName) AS playerName FROM infractions WHERE playerName = '" . $player['playerName'] ."' ORDER BY COUNT(playerName) DESC") as $infracted) {
echo "<tr>";
echo "<td>";
echo $player['playerName'];
echo "</td>";
echo "<td>";
echo $infracted['playerName'];
echo "</td>";
echo "<tr>";
}   
}

我想解释什么

  

这也在评论中,但我只是在这里添加,以便其他人可以更好地看到它。

所以这个想法基本上是按TOTAL INFRACTIONS的数量进行排序,并按降序排序(从最低到最低)。现在的问题是我没有列'totalInfractions'我不想添加,除非没有其他方法没有列。所以问题是如果可以在不添加'totalInfractions'列的情况下执行此操作,或者是否有其他方法可以通过其他SQL STATEMENTS或PHP函数执行此操作。

如果您不理解某些内容,请告诉我,我会尝试清除它。我明白我要求的是有点混乱。

1 个答案:

答案 0 :(得分:1)

如果我明白你想要完成什么......

我运行了这个查询:

SELECT COUNT(id), playerName from Example group by playerName;

输出是这样的:

+-----------+------------+

| count(id) | playername |

+-----------+------------+

|         4 | Alpha      |

|         2 | Delta      |

|         2 | Echo       |

+-----------+------------+

我们正在做的是COUNTing每个ID(因为每个条目代表一次违规,这相当于计算违规次数),然后按玩家名称进行GROUPing,这样我们就可以得到每个玩家的总数。这接近你想要做的吗?

我为格式不佳的复制/粘贴结果表道歉,我不知道如何让它看起来更好。

如果将来添加更多infractionTypes,您可能需要这样的内容: SELECT COUNT(id),playername,infractionType来自示例GROUP BY infractionType,playername;

将产生如下结果:

+-----------+------------+----------------+

| count(id) | playername | infractionType |

+-----------+------------+----------------+

|         3 | Alpha      | ET1            |

|         1 | Delta      | ET1            |

|         1 | Alpha      | ET2            |

|         1 | Delta      | ET2            |

|         2 | Echo       | ET2            |

+-----------+------------+----------------+