PHP项目统计失误次数哪队更少?
你的问题描述得比较简略,我理解你可能是想实现一个统计各队/各小组失误次数,并比较哪队失误更少的功能,下面给出一个完整的 PHP 实现思路和示例代码。

数据表设计思路
假设有两张表(或一个二维数组结构):
-- 队伍表
CREATE TABLE teams (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
);
-- 失误记录表
CREATE TABLE mistakes (
id INT PRIMARY KEY AUTO_INCREMENT,
team_id INT NOT NULL,
mistake_type VARCHAR(50),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (team_id) REFERENCES teams(id)
);
核心统计 SQL
SELECT
t.id,
t.name,
COUNT(m.id) AS mistake_count
FROM teams t
LEFT JOIN mistakes m ON m.team_id = t.id
GROUP BY t.id, t.name
ORDER BY mistake_count ASC;
COUNT(m.id) 而不是 COUNT(*),这样没有失误记录的队伍会正确显示为 0。
PHP 实现示例
<?php
$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 1. 统计每队失误次数
$sql = "SELECT t.id, t.name, COUNT(m.id) AS mistake_count
FROM teams t
LEFT JOIN mistakes m ON m.team_id = t.id
GROUP BY t.id, t.name
ORDER BY mistake_count ASC";
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
if (empty($rows)) {
echo "暂无数据\n";
exit;
}
// 2. 找出最少的失误次数
$minCount = min(array_column($rows, 'mistake_count'));
// 3. 找出所有达到最少失误的队伍(可能有并列)
$winners = array_filter($rows, fn($r) => $r['mistake_count'] == $minCount);
// 4. 输出结果
echo "各队失误统计:\n";
foreach ($rows as $r) {
echo " {$r['name']}: {$r['mistake_count']} 次\n";
}
echo "\n失误最少的队伍({$minCount} 次):\n";
foreach ($winners as $w) {
echo " ✔ {$w['name']}\n";
}
几个关键点提醒
| 问题 | 说明 |
|---|---|
| 并列第一 | 用 min() + array_filter 找出所有并列最少者,不要只取第一条 |
| 零失误 | 用 LEFT JOIN + COUNT(m.id),避免没失误的队伍被漏掉 |
| 并列输出 | 真实场景常出现多队并列,需要明确"更少"是取唯一还是全部 |
| 性能 | mistakes.team_id 加索引;数据量大时考虑汇总表 |
| 时间范围 | 若按赛季/时段统计,SQL 要加 WHERE m.created_at BETWEEN ... |
如果你的场景更具体
请补充一下你的实际情况,我可以给你更精准的代码:
- 数据来源:数据库表?数组?CSV?
- "失误"的定义:每条记录算一次?还是有 weight 字段?
- "更少"的判定:只要最少的那队,还是所有并列最少的队?
- 是否需要按时间段/项目分类统计?
告诉我这些,我可以直接给出贴合你项目的实现。