对于我游戏中的每个区域,我都有很多可以实现的关卡。一旦用户在一个区域中获得一定数量的点,他的“进度水平”就会增加。我的数据库中有两个表。一个存储用户在我的游戏的特定区域的进度:
Table A
userID | areaID | progressLevel | total points earnt
1 1 1 1000
1 2 1 500
另一张表B存储了解锁所需的点数以提高进度水平
areaID | progressLevel | points required
1 2 5000
1 3 9000
1 4 11000
2 2 9999
当用户获得足够的积分时,我检查表B并增加表A中用户的进度水平。例如,如果用户1在区域1
中获得超过5000点,我会更新表A并设置进度级别= 2
。
我的问题是我想编写一个查询,以便为特定用户获取每个区域的所有进度级别以及下一级别所需的点数。例如,对于id为1的用户,我想:
areaID | progressLevelCurrent | total points earnt | points required for next progress level
1 1 1000 4000
2 1 500 9499
是否可以在单个查询中执行此操作?
答案 0 :(得分:1)
这个怎么样:
select A.areaID, A.progressLevel as progressLevelCurrent, A.`total points earnt`, B.`points required` - A.`total points earnt` as `points required for next progress level`
from A
inner join B on A.areaID = B.areaID and (A.progressLevel + 1) = B.progressLevel
where B.`points required` > A.`total points earnt`;
答案 1 :(得分:0)
SELECT
areaID,
progressLevel AS CurrentLevel,
`total points earnt` as TotalNow,
(
SELECT (pointsTilNext - TableA.TotalNow)
FROM TableB
WHERE TableB.progressLevel = (TableA.progressLevel+1)
) AS ToNextLevel
FROM TableA
WHERE userID = ##
编辑添加:
您还可以使用连接,这将更有效地使用服务器容量。左连接将返回一个人的结果,即使该人处于最高级别,即没有行匹配TableA.progressLevel+1
SELECT
areaID,
progressLevel AS CurrentLevel,
`total points earnt` as TotalNow,
(pointsTilNext - TableA.TotalNow) AS ToNextLevel
FROM TableA
LEFT JOIN TableB ON TableB.progressLevel = (TableA.progressLevel+1)
WHERE userID = ##