Я пытаюсь получить некоторую статистику для онлайн-игры, которую я поддерживаю. Я ищу инструкцию SQL, чтобы получить результат внизу.
Есть три таблицы:
Таблица с командами, каждая из которых имеет уникальный идентификатор.
table teams
---------------------
| teamid | teamname |
|--------|----------|
| 1 | team_a |
| 2 | team_x |
---------------------
Таблица с игроками, каждая из которых имеет уникальный идентификатор и необязательно принадлежность к одной команде своим уникальным teamid.
table players
--------------------------------
| playerid | teamid | username |
|----------|--------|----------|
| 1 | 1 | user_a |
| 2 | | user_b |
| 3 | 2 | user_c |
| 4 | 2 | user_d |
| 5 | 1 | user_e |
--------------------------------
Наконец, таблица с событиями. Событие (продолжительность в секундах) связано с одним из игроков через их игрок.
table events.
-----------------------
| playerid | duration |
|----------|----------|
| 1 | 2 |
| 2 | 5 |
| 3 | 3 |
| 4 | 8 |
| 5 | 12 |
| 3 | 4 |
-----------------------
Я пытаюсь получить результат, в котором суммируются длительности всех членов команды.
result
--------------------------
| teamid | SUM(duration) |
|--------|---------------|
| 1 | 14 | (2+12)
| 2 | 15 | (3+8+4)
--------------------------
Я пробовал несколько комбинаций UNION, WHERE IN, JOIN и GROUP, но не мог понять. Я использую PostgreSQL и PHP. Может кто-нибудь мне помочь?
Просто используйте sum
с group by
:
select t.teamid, sum(e.duration)
from team t
join players p on t.teamid = p.teamid
join events e on p.playerid = e.playerid
group by t.teamid
Если вам нужно вернуть все команды, даже если у них нет событий, используйте вместо этого outer join
.
Попробуй это
SELECT teamid, Sum(duration),
AS LineItemAmount, AccountDescription
FROM teams
JOIN teams ON teams.teamid = players.teamid
JOIN events ON players.playersid = events.playersid
JOIN GLAccounts ON InvoiceLineItems.AccountNo = GLAccounts.AccountNo
GROUP BY teamid
http://www.w3computing.com/sqlserver/inner-joins-join-two-tables/