Как использовать COUNT с таблицами JOIN SQL 3 - PullRequest
0 голосов
/ 23 марта 2020

У меня есть 3 таблицы.

Первая таблица - это Битвы со столбцами:

--battleId(primary)--gameId(foreign)--prize--

Вторая таблица - это Игры со столбцами:

--gameId(primary)--gameName--

Три таблицы - это BattleParticipants с колонками:

--battleParticipantsId(primary)--userId(foreign)--battleId(foreign)--score--

Сначала я написал этот запрос, чтобы присоединиться к Battles and Games и получить данные BattleId, выигрышей и gameName:

SELECT
    battles.battleId
  , battles.prize
  , games.gameName 
FROM
  battles 
JOIN 
  games 
ON 
  battles.gameId = games.gameId

Этот запрос возвращает battleId,prize,gameName данные каждое сражение.

Я хочу расширить этот запрос, чтобы получить количество участников в каждом сражении (что означает строки в таблице BattleParticipant с Battles.battleId = BattleParticipants.battleId) каким-то образом комбинируя его с таблицей BattleParticipants.

Таким образом, результатом должно быть: battleId, приз, gameName, numberOfParticipantInBattle

Пример Таблицы и результат:

Сражения:

 --battleId(primary)--gameId(foreign)--prize--
      asd123               1               100
      asd1234              2               200
      asd1235              1               300

Игры:

  --gameId(primary)--gameName--
           1             Some Game
           2             Another Game

Участники битвы:

   --battleParticipantsId(primary)--userId(foreign)--battleId(foreign)--score--
                 1                     qwedqweqw       asd123             100
                 2                     qweqwe         asd1234             200
                 3                     qweadgjhg      asd123              400
                 4                       asd           asd123             500

Ожидаемый результат:

[ RowDataPacket {
    battleId: 'asd123',
    prize: 100,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 3 },
  RowDataPacket {
    battleId: 'asd1234',
    prize: 200,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 1 },
  RowDataPacket {
    battleId: 'asd1235',
    prize: 300,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 0 }
 ]

Это то, что я получу, если попробую дать ответ @Gordon Линофф:

[ RowDataPacket {
    battleId: 'asd123',
    prize: 100,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 3 },
  RowDataPacket {
    battleId: 'asd1234',
    prize: 200,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 1 },
  RowDataPacket {
    battleId: 'asd1235',
    prize: 300,
    gameName: 'Some Game',
    numberOfParticipantInBattle: 0 },
  RowDataPacket {
    battleId: 'asd123',
    prize: 100,
    gameName: 'Another Game',
    numberOfParticipantInBattle: 3 },
  RowDataPacket {
    battleId: 'asd1234',
    prize: 200,
    gameName: 'Another Game',
    numberOfParticipantInBattle: 1 },
  RowDataPacket {
    battleId: 'asd1235',
    prize: 300,
    gameName: 'Another Game',
    numberOfParticipantInBattle: 0 } ]

есть ли способ ove дубликаты или я должен сделать это вручную

1 Ответ

2 голосов
/ 23 марта 2020

Я думаю, вам просто нужны дополнительные JOIN и GROUP BY:

SELECT b.battleId, b.prize, g.gameName,
       COUNT(*) as numberOfParticipantInBattle
FROM battles b JOIN
     games g
     ON b.gameId = b.gameId JOIN
     BattleParticipants bp
     ON b.battleId = bp.battleId
GROUP BY b.battleId, b.prize, g.gameName;

Если в некоторых сражениях нет участников, и вы хотите включить их, используйте LEFT JOIN:

SELECT b.battleId, b.prize, g.gameName,
       COUNT(bp.battleId) as numberOfParticipantInBattle
FROM battles b JOIN
     games g
     ON b.gameId = b.gameId LEFT JOIN
     BattleParticipants bp
     ON b.battleId = bp.battleId
GROUP BY b.battleId, b.prize, g.gameName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...