php项目统计射门次数哪队更多?

wen PHP项目 1

PHP项目统计射门次数哪队更多

下面给你一个完整的实现思路和代码示例,适用于足球比赛数据统计场景。

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 注入

进阶优化建议

  1. 加比分表:结合 matches 的比分做"射门效率"分析(每进 1 球所需射门数)。
  2. 按赛事/阶段过滤:加 competition_id 字段,支持欧冠、联赛分别统计。
  3. 缓存:排行榜结果可写入 Redis,避免每次全表扫描。
  4. 可视化:用 Chart.js 把两队射门时间分布画成柱状图。

如果你有具体的数据库表结构或想统计的是 篮球/冰球 等其他运动,告诉我我可以调整字段(比如篮球加"两分/三分命中",冰球加"power play")。

上一篇php项目认为远射破门可能性大吗?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝