Как посчитать только запись в левом соединении? - PullRequest
0 голосов
/ 25 июня 2018

Мне нужно посчитать, сколько голов забил конкретный игрок в конкретную команду, которая играет в конкретном соревновании.У меня есть три стола:

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

в первомВ части запроса я попытался выбрать все голы, забитые игроком искомой команды, используя соединение на goal и player.Я фильтрую те результаты для round, которые соответствуют Compet.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 У меня три записи, это означает, что команда 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 голосов
/ 25 июня 2018

Я не понимаю ваш запрос. Почему у вас 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, только если вы хотите, чтобы игрок не забил ни одного гола.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...