如何只计算左联接中的记录?

时间:2018-06-25 09:15:12

标签: mysql sql pdo

我需要计算在一个特定的比赛中,一个特定的球员进入一个特定的团队后有多少个进球。 我有三个表:

  1. 比赛:包含团队为特定比赛(一轮)进行的所有比赛
  2. 玩家包含玩家的详细信息,例如:姓名,姓氏,身高等...
  3. 目标:包含该球员在一场比赛中得分的所有进球

这是我的查询

$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";

在查询的第一部分中,我尝试使用goalplayer上的联接来选择被搜索球队的球员得分的所有目标。 我为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)

enter image description here

1 个答案:

答案 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