Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询-使用条件语句连接两个表_Mysql_Sql_Database - Fatal编程技术网

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

Mysql SQL查询-使用条件语句连接两个表,mysql,sql,database,Mysql,Sql,Database,对于我游戏中的每个领域,我都有很多可以达到的水平。一旦用户在某个领域获得一定数量的积分,他在该领域的“进步水平”就会提高。我的数据库中有两个表。其中一个存储用户在我的游戏特定区域的进度: Table A userID | areaID | progressLevel | total points earnt 1 1 1 1000 1 2 1 500

对于我游戏中的每个领域,我都有很多可以达到的水平。一旦用户在某个领域获得一定数量的积分,他在该领域的“进步水平”就会提高。我的数据库中有两个表。其中一个存储用户在我的游戏特定区域的进度:

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在area
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
是否可以在一个查询中执行此操作?

如何:

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`;
编辑以添加:

您还可以使用连接,这将更有效地利用服务器容量。即使某人处于最高级别,左联接也将返回其结果,即没有行匹配
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 = ##

我更喜欢另一种方法,因为当用户达到最大进度级别时,该行根本不会显示在该查询中,我认为您可以通过添加WHERE子句(请参见我编辑的答案)来完成同样的事情,并且您的性能会比使用子查询时更好。这里确实不需要子查询,并且会对绩效产生负面影响。
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 = ##