mysql - 如何将 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"
因此,鉴于这些单独的查询,我如何在一个查询中检索我想要的数据?(我真的不需要使用上面的查询,我只是将它们作为示例,因为它们会分别获取我想要的数据)
我不能添加小提琴,因为由于某种原因创建代码抛出错误。现在我添加表格和数据的图片:
解决方案
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。
推荐阅读
- python - 我需要在 python 中编写一个 while 循环,要求输入文本,直到用户给出空白输入
- javascript - 一种在 React Native 中同步恢复数据的方法
- android - 灰色禁用按钮
- prolog - 使用运行长度编码压缩序言中的列表
- azure - Azure 函数队列触发器连接 - 我可以从变量或特别是 Azure 应用程序配置中设置它吗?
- c - Bash 没有为可执行文件设置内存
- html - 带顺风的类 text-white 不起作用
- python - 如果我不调用 super().__init__(),自定义异常类的父级如何获取参数?
- typescript - 链接观察者 RxJs
- java - java:错误:不支持发布版本 17