首页 > 解决方案 > 如何将 3 个查询合并为 1 个

问题描述

我有 2 张桌子:

战斗

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

战斗参与者

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

给定 userId,我只想获取每个参与战斗的用户的结束战斗数据以及额外的玩家排名信息和参与战斗的玩家总数信息结束战斗意味着只有 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"

因此,鉴于这些单独的查询,我如何在一个查询中检索我想要的数据?(我真的不需要使用上面的查询,我只是将它们作为示例,因为它们会分别获取我想要的数据)

我不能添加小提琴,因为由于某种原因创建代码抛出错误。现在我添加表格和数据的图片:

战斗表: 在此处输入图像描述

战斗参与者表: 在此处输入图像描述

下面查询错误结果: 在此处输入图像描述

标签: mysqlsql

解决方案


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。


推荐阅读