php项目统计任意球直接得分几次?

wen PHP项目 3

PHP项目统计任意球直接得分次数

下面给你一个完整的实现思路和代码示例,任意球直接得分通常从比赛事件表中统计,需要区分"直接任意球破门"和"间接任意球/传中后破门"。

php项目统计任意球直接得分几次?

数据库设计

假设有一张比赛事件表 match_events:

CREATE TABLE match_events (
    id INT PRIMARY KEY AUTO_INCREMENT,
    match_id INT NOT NULL,
    player_id INT NOT NULL,
    team_id INT NOT NULL,
    event_type VARCHAR(32) NOT NULL,      -- 'goal', 'assist', 'yellow_card' ...
    goal_type VARCHAR(32) DEFAULT NULL,   -- 'free_kick_direct', 'penalty', 'open_play' ...
    minute INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

关键字段是 goal_type = 'free_kick_direct',表示直接任意球得分。

基础统计 SQL

统计全联盟任意球直接得分总数

SELECT COUNT(*) AS total
FROM match_events
WHERE event_type = 'goal'
  AND goal_type = 'free_kick_direct';

按球员统计(排行榜)

SELECT p.id, p.name, COUNT(*) AS free_kick_goals
FROM match_events e
JOIN players p ON p.id = e.player_id
WHERE e.event_type = 'goal'
  AND e.goal_type = 'free_kick_direct'
GROUP BY p.id, p.name
ORDER BY free_kick_goals DESC;

按球队统计

SELECT t.id, t.name, COUNT(*) AS free_kick_goals
FROM match_events e
JOIN teams t ON t.id = e.team_id
WHERE e.event_type = 'goal'
  AND e.goal_type = 'free_kick_direct'
GROUP BY t.id, t.name
ORDER BY free_kick_goals DESC;

某个球员在指定赛季的任意球得分

SELECT COUNT(*) AS total
FROM match_events e
JOIN matches m ON m.id = e.match_id
WHERE e.player_id = :player_id
  AND e.event_type = 'goal'
  AND e.goal_type = 'free_kick_direct'
  AND m.season_id = :season_id;

PHP 实现(PDO 示例)

<?php
class FreeKickStats
{
    private PDO $pdo;
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    /** 全部任意球直接得分总数 */
    public function total(): int
    {
        $sql = "SELECT COUNT(*) FROM match_events
                WHERE event_type = 'goal' AND goal_type = 'free_kick_direct'";
        return (int) $this->pdo->query($sql)->fetchColumn();
    }
    /** 球员排行榜 */
    public function playerRanking(int $limit = 10): array
    {
        $sql = "SELECT p.id, p.name, COUNT(*) AS goals
                FROM match_events e
                JOIN players p ON p.id = e.player_id
                WHERE e.event_type = 'goal' AND e.goal_type = 'free_kick_direct'
                GROUP BY p.id, p.name
                ORDER BY goals DESC
                LIMIT :limit";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /** 指定球员的任意球进球数(可按赛季过滤) */
    public function playerCount(int $playerId, ?int $seasonId = null): int
    {
        $sql = "SELECT COUNT(*)
                FROM match_events e
                JOIN matches m ON m.id = e.match_id
                WHERE e.player_id = :pid
                  AND e.event_type = 'goal'
                  AND e.goal_type = 'free_kick_direct'";
        if ($seasonId !== null) {
            $sql .= " AND m.season_id = :sid";
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':pid', $playerId, PDO::PARAM_INT);
        if ($seasonId !== null) {
            $stmt->bindValue(':sid', $seasonId, PDO::PARAM_INT);
        }
        $stmt->execute();
        return (int) $stmt->fetchColumn();
    }
}
// 使用
$pdo = new PDO('mysql:host=localhost;dbname=football;charset=utf8mb4', 'root', '', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stats = new FreeKickStats($pdo);
echo "任意球直接得分总数: " . $stats->total() . PHP_EOL;
print_r($stats->playerRanking(10));

几个实现上的注意点

  1. 数据来源要先明确

    • 如果是你自己录入的事件数据,只要约定好 goal_type='free_kick_direct' 即可。
    • 如果是第三方 API(如 Football-Data、API-Football),字段名一般是 "Free Kick"、"Free Kick Goal" 或事件 type=Goal, detail=Free Kick,需要在入库时统一映射。
  2. 区分直接/间接任意球
    很多数据源不区分"直接"和"间接",若原始数据没有 goal_type,无法严格统计"直接得分",建议:

    • 在录入端增加一个标记字段;
    • 或对模糊数据统一按"任意球进球"统计,并在页面注明口径。
  3. 避免重复统计

    • 事件表加唯一约束 UNIQUE(match_id, minute, event_type, player_id) 防止重复入库。
    • 统计时用 COUNT(DISTINCT e.id) 更保险。
  4. 性能优化

    CREATE INDEX idx_goal_type ON match_events(event_type, goal_type);
    CREATE INDEX idx_player_goal ON match_events(player_id, goal_type);
  5. 按赛季/赛事范围过滤
    排行榜最好带 season_id、competition_id 参数,否则跨赛季数据混在一起意义不大。


如果你能告诉我:

  • 你的数据表结构(字段名)
  • 数据是自建还是第三方接口

我可以直接帮你改写成贴合你项目的 SQL 和 PHP 代码。

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

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