我有以下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行以上还没有完成。
有没有人可以指出我正确的方向?
非常感谢。
答案 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
一起使用并在第二个表中包含逻辑的少数情况之一。