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

Запрос работает отлично, однако, чтобы я мог получить имя пользователя, мне нужно будет выполнить другой запрос на основе возвращенных результатов (player_id).

Можно ли изменить мой существующий запрос на объединение двух таблиц? Я знаю, что это возможно с обычным запросом, я просто не уверен, есть ли это в этом случае, из-за возвращаемой настраиваемой таблицы результатов.

Это моя начальная таблица, которая называется results:

+----------------+-------------+-----+
| Field          | Type        | Key |
+----------------+-------------+-----+
| results_id     | int         | Pri |
| community_id   | int         |     |
| player1_id     | int         |     |
| player1_goals  | int         |     |
| player2_id     | int         |     |
| player2_goals  | int         |     |
+----------------+-------------+-----+

Это запрос, который я использую для возврата моих результатов:

select player, sum(goals) from 
((select player1_id as player, player1_goals as goals from results where community_id = 5 ) 
union all 
(select player2_id as player, player2_goals as goals from results where community_id = 5 ) 
) p 
group by player 
order by sum(goals) desc

И вот как возвращаются мои результаты:

+----------------+------------+
| Player         | sum(goals) |
+----------------+------------+
| 2              | 94         |
| 14             | 63         |
| 7              | 43         |
+----------------+------------+

Можно ли изменить приведенный выше запрос и добавить join в мою таблицу users:

+--------+-----------+
| id     | user_name  |
+---------------------+
| 2      | John       |
| 7      | Andrew     |
| 14     | Charles    |
+--------+------------+

Чтобы получить результат:

+----------------+----------------+------------+
|user_name       | Player         | sum(goals) |
+----------------+----------------+------------+
| John           | 2              | 94         |
| Charles        | 14             | 63         |
| Andrew         | 7              | 43         |
+----------------+----------------+------------+
1
Northfield82 25 Ноя 2016 в 18:58

2 ответа

Лучший ответ

Короткий ответ - да, можно:

select u.user_name, sum(goals) from 
((select player1_id as player, player1_goals as goals from results where community_id = 5 ) 
union all 
(select player2_id as player, player2_goals as goals from results where community_id = 5 ) 
) p 
join users u on p.player = u.id
group by player 
order by sum(goals) desc
0
Mureinik 25 Ноя 2016 в 16:02

Вы можете сделать это с помощью join. Вы также можете выразить это как:

select u.*,
       (select sum(case when u.id = r.player1_id then r.player1_goals else r.player2_goals)
        from results r
        where r.community_id = 5 and
              u.id in (r.player1_id, r.player2_id)
       ) as goals
from users u;
1
Gordon Linoff 25 Ноя 2016 в 16:04