SQL查询 - 使用条件连接两个表

时间:2014-02-07 03:44:37

标签: mysql sql database

对于我游戏中的每个区域,我都有很多可以实现的关卡。一旦用户在一个区域中获得一定数量的点,他的“进度水平”就会增加。我的数据库中有两个表。一个存储用户在我的游戏的特定区域的进度:

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

是否可以在单个查询中执行此操作?

2 个答案:

答案 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 = ##