本文目录导读:

- 情况一:数据库层面(最快)
- 情况二:如果你在写 PHP 代码计算(比如只有循环,没有聚合查询)
- 情况三:查看“双方差异”(重点)
- 情况四:如果你连“射门”数据都没有(只有比分)
- 调试建议(针对你的PHP项目)
这个问题问得比较具体,但“怎么看”取决于你手头的数据结构,在足球或篮球的PHP项目中,通常有两种情况:
- 你有现成的数据表(比如
matches、shots表),只是不知道怎么查。 - 你只有代码逻辑,想改代码来计算。
我分几种情况给你排查和解决方案,你可以直接复制对应的SQL或PHP代码。
数据库层面(最快)
假设你有两张表:matches(比赛)和 shots(射门记录)。
matches 表结构示例:
id, home_team_id, away_team_id, home_shots, away_shots, home_goals, away_goals
shots 表结构示例(更精细):
id, match_id, team_id, is_goal (0/1), shot_type
只算射门转化率(射门数 vs 进球数)
如果表里已经有射门数和进球数,直接查:
SELECT
team_name,
SUM(home_goals + away_goals) AS total_goals,
SUM(home_shots + away_shots) AS total_shots,
ROUND(SUM(home_goals + away_goals) / NULLIF(SUM(home_shots + away_shots), 0) * 100, 2) AS conversion_rate
FROM matches m
JOIN teams t ON t.id = m.home_team_id OR t.id = m.away_team_id
GROUP BY team_name
ORDER BY conversion_rate DESC;
如果数据在 shots 明细表里(更准确)
按球队分组统计:
SELECT
t.name,
COUNT(s.id) AS total_shots,
SUM(s.is_goal) AS goals,
ROUND(SUM(s.is_goal) / NULLIF(COUNT(s.id), 0) * 100, 2) AS conversion_rate
FROM shots s
JOIN teams t ON s.team_id = t.id
GROUP BY s.team_id
ORDER BY conversion_rate DESC;
如果你在写 PHP 代码计算(比如只有循环,没有聚合查询)
假设你的 PHP 代码里已经有射门和进球数组,可以这样算:
$teams_data = [
'主队' => ['shots' => 15, 'goals' => 3],
'客队' => ['shots' => 10, 'goals' => 1]
];
foreach ($teams_data as $team => $data) {
$conversion = $data['shots'] > 0
? round(($data['goals'] / $data['shots']) * 100, 2) . '%'
: '0%';
echo "$team 转化率: $conversion\n";
}
查看“双方差异”(重点)
如果你是要对比双方(比如主队 vs 客队),可以在SQL里用窗口函数或条件聚合:
SELECT
match_id,
-- 主队转化率
ROUND(SUM(CASE WHEN team_id = home_team_id THEN is_goal END)
/ NULLIF(SUM(CASE WHEN team_id = home_team_id THEN 1 END), 0) * 100, 2) AS home_rate,
-- 客队转化率
ROUND(SUM(CASE WHEN team_id = away_team_id THEN is_goal END)
/ NULLIF(SUM(CASE WHEN team_id = away_team_id THEN 1 END), 0) * 100, 2) AS away_rate,
-- 差异
ROUND(SUM(CASE WHEN team_id = home_team_id THEN is_goal END)
/ NULLIF(SUM(CASE WHEN team_id = home_team_id THEN 1 END), 0) * 100
- SUM(CASE WHEN team_id = away_team_id THEN is_goal END)
/ NULLIF(SUM(CASE WHEN team_id = away_team_id THEN 1 END), 0) * 100, 2) AS rate_difference
FROM shots s
JOIN matches m ON s.match_id = m.id
GROUP BY match_id;
如果你连“射门”数据都没有(只有比分)
那就只能看预期进球(xG)或者单纯靠前场控球率来间接评估,但这不属于“射门转化率”范畴了,需要先补充数据。
调试建议(针对你的PHP项目)
如果你不确定数据在哪,先在 phpMyAdmin 或命令行里跑:
SHOW TABLES LIKE '%shot%'; SHOW TABLES LIKE '%match%';
然后看表结构,把表名和字段名发给我,我可以帮你精确改写SQL。
- 最快:
matches表有射门和进球数,直接用第一条SQL。 - 最准:如果有
shots明细表,用第二条SQL。 - 如果报错:
NULLIF为了防止除零,ROUND控制小数,team_name字段换成你实际的列名。
如果还是卡住,直接贴一段你的表结构或PHP代码片段,我给你改。