如何查询指定用户的所有关卡及对应进度(含未完成关卡)
解决用户关卡进度查询中缺失未完成关卡的问题
这个问题的核心是你把用户过滤条件放错位置啦!咱们来一步步修正:
首先,你原来的查询里,IFNULL(progreslevel.id_user, 1)会把没有用户进度记录的关卡的id_user强制设为1,之后的HAVING id_user = 2直接把这些关卡排除了——这就是为啥用户2查不到Basic Level2的原因。
要解决这个问题,咱们需要把用户匹配的条件放到LEFT JOIN的关联条件里,而不是在后面过滤。这样就能保证所有符合id_sub=1的关卡都会被返回,没有该用户进度的关卡就自动用0填充完成数。
修改后的SQL语句
以查询用户2为例,写法如下:
SELECT 2 AS id_user, level.*, IFNULL(progreslevel.completed, 0) AS completedquestions FROM level LEFT JOIN progreslevel ON level.id_level = progreslevel.id_level AND progreslevel.id_user = 2 -- 在这里指定要查询的用户 WHERE level.id_sub = 1;
如果需要更灵活地切换用户,可以用变量实现:
-- 先设置目标用户ID SET @target_user = 2; SELECT @target_user AS id_user, level.*, IFNULL(progreslevel.completed, 0) AS completedquestions FROM level LEFT JOIN progreslevel ON level.id_level = progreslevel.id_level AND progreslevel.id_user = @target_user WHERE level.id_sub = 1;
原理说明
把用户ID的匹配放在LEFT JOIN的ON子句中,意味着我们只关联当前目标用户的进度记录,而不是所有用户的进度。这样一来:
- 有该用户进度的关卡:会关联到对应的
completed数值 - 没有该用户进度的关卡:
progreslevel的所有字段都是NULL,通过IFNULL把completed转为0,同时id_user直接指定为目标用户,不会出现被过滤的情况
用这个查询语句,不管你查询哪个用户,所有id_sub=1的关卡都会被返回,未完成的关卡进度显示为0,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Aftar Fadilah
相关产品推荐
相关产品推荐

