PHP项目统计射门次数哪队更多
下面给你一个完整的实现思路和代码示例,适用于足球比赛数据统计场景。

数据库设计
CREATE TABLE matches (
id INT PRIMARY KEY AUTO_INCREMENT,
home_team VARCHAR(50),
away_team VARCHAR(50),
match_time DATETIME
);
CREATE TABLE shots (
id INT PRIMARY KEY AUTO_INCREMENT,
match_id INT,
team VARCHAR(50),
player VARCHAR(50),
shot_time INT, -- 比赛第几分钟
is_on_target TINYINT, -- 是否射正 1/0
is_goal TINYINT, -- 是否进球 1/0
FOREIGN KEY (match_id) REFERENCES matches(id)
);
核心统计逻辑(PDO 示例)
<?php
class ShotStatistics
{
private PDO $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
/**
* 统计某场比赛两队射门次数,返回射门更多的一方
*/
public function compareShots(int $matchId): array
{
$sql = "SELECT
team,
COUNT(*) AS total_shots,
SUM(is_on_target) AS shots_on_target,
SUM(is_goal) AS goals
FROM shots
WHERE match_id = :match_id
GROUP BY team
ORDER BY total_shots DESC";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([':match_id' => $matchId]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($rows) < 2) {
throw new RuntimeException('数据不完整,无法比较两队射门次数');
}
$first = $rows[0];
$second = $rows[1];
if ($first['total_shots'] == $second['total_shots']) {
$winner = '平局';
} else {
$winner = $first['team'];
}
return [
'teams' => $rows,
'more_shots' => $winner,
];
}
/**
* 统计某支球队在赛季中的总射门次数
*/
public function teamSeasonShots(string $team): int
{
$stmt = $this->pdo->prepare(
"SELECT COUNT(*) FROM shots WHERE team = :team"
);
$stmt->execute([':team' => $team]);
return (int) $stmt->fetchColumn();
}
/**
* 统计整个联赛各队的场均射门,按降序返回
*/
public function leagueRanking(): array
{
$sql = "SELECT
s.team,
COUNT(*) AS total_shots,
COUNT(DISTINCT s.match_id) AS matches_played,
ROUND(COUNT(*) / COUNT(DISTINCT s.match_id), 2) AS avg_shots
FROM shots s
GROUP BY s.team
ORDER BY avg_shots DESC";
return $this->pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
使用示例
$pdo = new PDO('mysql:host=localhost;dbname=football;charset=utf8mb4', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stats = new ShotStatistics($pdo);
// 1. 比较某场比赛
$result = $stats->compareShots(1);
echo "射门更多的一方是:{$result['more_shots']}\n";
foreach ($result['teams'] as $t) {
echo "{$t['team']}: 射门 {$t['total_shots']} 次,"
. "射正 {$t['shots_on_target']},进球 {$t['goals']}\n";
}
// 2. 联赛射门排行榜
echo "\n=== 联赛场均射门排行 ===\n";
foreach ($stats->leagueRanking() as $row) {
echo "{$row['team']}: 场均 {$row['avg_shots']} 次(共 {$row['total_shots']} 次)\n";
}
输出示例
射门更多的一方是:曼城
曼城: 射门 18 次,射正 7,进球 3
利物浦: 射门 9 次,射正 3,进球 1
=== 联赛场均射门排行 ===
曼城: 场均 16.50 次(共 330 次)
阿森纳: 场均 15.20 次(共 304 次)
...
关键点说明
| 要点 | 说明 |
|---|---|
| 分组统计 | GROUP BY team + COUNT(*) 得到每队射门数 |
| 平局处理 | 射门数相等时返回"平局"而非硬取一队 |
| 扩展指标 | 顺带统计射正、进球,便于分析转化率 |
| 场均 | 用 COUNT(DISTINCT match_id) 做分母 |
| 安全 | 全程使用 PDO 预处理,防 SQL 注入 |
进阶优化建议
- 加比分表:结合
matches的比分做"射门效率"分析(每进 1 球所需射门数)。 - 按赛事/阶段过滤:加
competition_id字段,支持欧冠、联赛分别统计。 - 缓存:排行榜结果可写入 Redis,避免每次全表扫描。
- 可视化:用 Chart.js 把两队射门时间分布画成柱状图。
如果你有具体的数据库表结构或想统计的是 篮球/冰球 等其他运动,告诉我我可以调整字段(比如篮球加"两分/三分命中",冰球加"power play")。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播