You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询指定用户的所有关卡及对应进度(含未完成关卡)

解决用户关卡进度查询中缺失未完成关卡的问题

这个问题的核心是你把用户过滤条件放错位置啦!咱们来一步步修正:

首先,你原来的查询里,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:07:17