Как мне объединить 3 запроса в 1 - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 2 таблицы:

Битвы

--battleId(primary)--gameId(foreign)--endTime

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

--battleParticipantId(primary)--userId(foreign)--someNumerical--score--battleId(foreign)

Учитывая идентификатор пользователя, я хочу получить только битва закончилась данные для каждого участника битвы, участвующего в , с дополнительной информацией о ранге игрока и общим количеством игроков, участвовавших в битве, информация . Завершенная битва означает сражения только с endTime, меньшим, чем current_time

возвращенные данные битвы должны включать:

battleId:
endTime:
gameId:
score:
someNumerical:
rankOfPlayerInBattle:
totalNumberOfPlayersParticipatedInBattle:

для каждого участника сражения.

С помощью запроса ниже я могу получить battleId,endTime,gameId,score,someNumerical, как я хочу:

SELECT b.battleId,b.endTime,b.gameId,bp.score,bp.someNumerical FROM battles b  JOIN battleparticipants bp ON b.battleId=bp.battleId WHERE bp.userId="someuserid" AND b.endTime<CURRENT_TIMESTAMP

Учитывая battleId и userId этот запрос возвращает мне рейтинг пользователя в этой битве:

SET @i=0;
             SELECT battleId, userId,score, @i:=@i+1 AS myRank 
              FROM battleparticipants  WHERE battleId="asd1234" AND userId="someuserid"
              ORDER BY score DESC

Учитывая данный BattleId, этот запрос дает мне общее количество игроков, участвовавших в этой битве:

SELECT COUNT(*) FROM battleparticipants WHERE battleId="asd1234"

Итак, учитывая эти отдельные запросы, как мне получить нужные данные в одном запросе? (Мне действительно не нужно использовать вышеупомянутые запросы, я просто привел их в качестве примера, поскольку они получают данные, которые я хочу отдельно)

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

Таблица сражений: enter image description here

Таблица участников боевых действий: enter image description here

Ниже неправильный результат запроса: enter image description here

1 Ответ

1 голос
/ 25 марта 2020
SELECT b.battleId,b.endTime,b.gameId,bp.score,bp.someNumerical , RANK()OVER(PARITITON BY b.battleId, bp.userId order by score desc) rankOfPlayerInBattle , BP_C.CNT totalNumberOfPlayersParticipatedInBattle
FROM battles b  
JOIN battleparticipants bp ON b.battleId=bp.battleId 
JOIN (SELECT battleId , COUNT(*) CNT FROM battleparticipants GROUP BY battleId)  BP_C ON BP_C.battleId=bp.battleId 
WHERE bp.userId="someuserid" AND b.endTime<CURRENT_TIMESTAMP

Вы можете использовать выше SQL.

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