SQL: получить данные распределены по 3 таблицам

0

Я пытаюсь получить некоторую статистику для онлайн-игры, которую я поддерживаю. Я ищу инструкцию 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. Может кто-нибудь мне помочь?

Теги:

2 ответа

0
Лучший ответ

Просто используйте 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.

  • 0
    Большое спасибо! Работает как шарм!
0

Попробуй это

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/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню