我需要计算在一个特定的比赛中,一个特定的球员进入一个特定的团队后有多少个进球。 我有三个表:
这是我的查询
$query = "SELECT
COUNT(*) AS goal_scored,
p.first_name AS first_name,
p.last_name AS last_name
FROM `match` m
LEFT JOIN goal g ON g.match_id = m.id
LEFT JOIN player p ON g.player_marker_id = p.id
WHERE m.round_id = :round_id
AND (m.home_team_id = :team_id OR m.away_team_id = :team_id)
GROUP BY p.id
ORDER BY goal_scored DESC
LIMIT 5";
在查询的第一部分中,我尝试使用goal
和player
上的联接来选择被搜索球队的球员得分的所有目标。
我为round
过滤了那些与Competition.id相对应的结果。
我希望在特定比赛中返回球队的最佳射手。
数据示例
匹配:
id | home_team_id | away_team_id |
1 95 121
2 203 95
3 95 122
目标:
id | player_marker_id | match_id | team_id | result | type
1 1005 1 95 1 - 0 1
2 1005 1 95 1 - 0 2
3 1005 2 95 2 - 1 1
4 1006 3 95 1 - 0 1
玩家:
id | first_name | surname
1005 Benedetto Ismael
1006 Ramon Abila
因此,如您在表match
中所见,我有3条记录,这意味着95
队参加了3场比赛。
在这支球队中,有两名球员,球员Benedetto
取得了2个进球,该队的得分王也是,预期结果应该是:
Benedetto
Ramon
但是我得到goal_scored
一个错误的结果,例如3
进球,这是错误的,因为type
在这个范围内并不重要。 type
只是告诉我哪种目标类型,特别是1是开启比赛的目标,而2是正常目标。一个目标最多可以有2个类型。
我还发现了另一个错误,不同的球员可以在同一场比赛中得分,但是goal_scored
的结果是不正确的,因为我只需要计算特定球员加入的进球数,而不是该球员的所有球员团队。
如何解决我的查询?
生产结果
SELECT * FROM `match` m
LEFT JOIN goal g ON m.id = g.match_id AND g.player_marker_id = 68165
WHERE m.round_id = 488 AND (m.home_team_id = 95 OR m.away_team_id = 95)
答案 0 :(得分:3)
我不理解您的查询。为什么有left join
个?
根据我对您的数据的解释,您只想查看type = 1
的目标。那么,这是您想要的吗?
SELECT p.first_name AS first_name,
p.last_name AS last_name,
COUNT(*) AS goal_scored
FROM player p JOIN
goal g
ON g.player_marker_id = p.id JOIN
`match` m
ON g.match_id = m.id
WHERE m.round_id = :round_id AND
:team_id IN (m.home_team_id, m.away_team_id) AND
g.type IN (1, 2)
GROUP BY p.first_name, p.last_name
ORDER BY goal_scored DESC
LIMIT 5;
仅当您希望没有进球的球员时才使用LEFT JOIN
。