SQL查询无法正常工作

时间:2018-04-20 13:48:42

标签: mysql sql

我有以下mySQL查询:

SELECT
    mp.*
  , m.*
FROM missions_progress mp
LEFT JOIN missions m ON mp.mid = m.id
WHERE NOT EXISTS(
  SELECT
     mid
   , uid
  FROM missions_progress mp
  WHERE uid = {$uid} AND mstatus = 'completed'
)

问题是'missions'表中有多行,但如果玩家完成1次任务,则不再加载其他任务。

以下是SQL查询的工作方式,

用户打开mission.php页面,看到他们可以执行的任务列表,如果他们启动一个,在mission_progress中插入一行mstatus ='inprogress',如果他们完成了这个任务,那么mstatus将是='已完成',任务完成。带着完整的任务列表将他们带回任务页面。然而最后一部分没有用,它说他们已经完成了0次任务,而任务表中至少有10行以上还没有完成。

有没有人可以指出我正确的方向?

非常感谢。

3 个答案:

答案 0 :(得分:1)

所以基本上你想在任务页面上显示所有可用的任务吗?

问题不是很明确,我们需要样本数据,但我会尽力使用一些简化的表和随机样本数据来回答你。

如果任务完成,则不会显示。如果没有完成,它会随着进度一起显示对吗?如果一个任务尚未开始,并且在mission_progress中没有任何内容,它仍然需要显示?

如果是这种情况,我认为您使用的是过于复杂的查询。我会尝试这样的事情:

SELECT
    m.*,
    mp.*
FROM missions m
    LEFT JOIN (SELECT *
               FROM missions_progress
               WHERE uID = {$uid}) mp ON mp.mID = m.nID
WHERE Coalesce(mp.mStatus, '') != 'completed'

我已尝试使用以下数据:

的任务:

ID  Name
--  -----
1   test1
2   test2
3   test3
4   test4
5   test5

mission_progress:

nID mID mStatus     uID
--- --- ----------- ---
1   1   in progress 1
2   3   in progress 1
3   3   completed   2
4   5   completed   1

我为用户#1执行了该操作,完成了任务5并且在任务1和3中取得了一些进展:

nID cName   nID  mID  mStatus     uID
--- -----   ---  ---  ----------- ---
1   test1   1    1    in progress   1
2   test2   NULL NULL NULL        NULL          
3   test3   2    3    in progress   1
4   test4   NULL NULL NULL        NULL

你可以看到任务#5没有被拉出,因为用户1已经完成了它。其他4个任务撤出。任务1和3有一些进展,但没有完成,所以他们退出了。

同样的查询,对于用户#2,完成了任务#3并且没有其他进展:

nID cName   nID  mID  mStatus     uID
--- -----   ---  ---  ----------- ---
1   test1   NULL NULL NULL        NULL
2   test2   NULL NULL NULL        NULL
4   test4   NULL NULL NULL        NULL
5   test5   NULL NULL NULL        NULL

如果我理解你的问题,我认为这就是你需要的!

答案 1 :(得分:0)

  

问题是“任务”表中有多行,   但是,如果玩家完成1次任务,则不会加载另一次任务   任务再见。

那是因为关闭

WHERE NOT EXISTS(
  SELECT
     mid
   , uid
  FROM missions_progress mp
  WHERE uid = {$uid} AND mstatus = 'completed'
)

您的查询需要更像。
但如果没有实例数据和预期产出,很难说。

查询

SELECT
    mp.*
  , m.*
FROM missions_progress mp
LEFT JOIN missions m ON mp.mid = m.id AND uid = {$uid} AND mstatus <> 'completed'

答案 2 :(得分:0)

你似乎想要某人没有完成的任务:

SELECT m.*
FROM missions m
WHERE NOT EXISTS (SELECT 1
                  FROM missions_progress mp
                  WHERE uid = {$uid} AND 
                        mp.mid = m.id AND
                        mp.mstatus = 'completed'
                 );

我认为你真的不想在结果集中使用missions_progress中的列。如果你这样做,那么你可能真的想要:

SELECT m.*, mp.missions_status
FROM missions m LEFT JOIN
     missions_progress mp
     ON mp.mid = m.id AND uid = {$uid}
WHERE mp.mission_status IS NULL OR mp.mission_status <> 'completed';

如果这是您想要的,那么您将WHERE子句与LEFT JOIN一起使用并在第二个表中包含逻辑的少数情况之一。