如何 select 每个级别都有不同的用户和用户进度

How to select every level with different user and user progress

我想制作一个学习应用程序,每个级别都有完成的问题进度跟踪。我有 2 个 table,其中包含所有级别及其问题计数,还有一个 table,用于保存每个级别的用户进度(已完成的问题)。这是记录,

等级table:

+----------+----------------------+-------------+--------+
| id_level | name                 | jumlah_soal | id_sub |
+----------+----------------------+-------------+--------+
|        1 | Basic Level 1        |           5 |      1 |
|        2 | Basic Level 2        |           6 |      1 |
|        3 | Basic Level 3        |           7 |      1 |
|        8 | Intermediate Level 1 |           5 |      2 |
|        9 | Intermediate Level 2 |           5 |      2 |
|       10 | Intermediate Level 3 |           5 |      2 |
..........................................................

进度Table:

+-----------------+---------+-------------+----------+
| id_progreslevel | id_user | completed   | id_level |
+-----------------+---------+-------------+----------+
|               1 |       1 |           2 |        1 |
|               2 |       1 |           3 |        2 |
|               3 |       2 |           2 |        1 |
+-----------------+---------+-------------+----------+

当我使用以下查询加入 table 时

SELECT IFNULL(progreslevel.id_user, 1) as id_user,
    -> level.*, IFNULL(progreslevel.completed, 0) as completedquestions
    -> FROM level LEFT JOIN progreslevel
    -> ON level.id_level = progreslevel.id_level
    -> WHERE level.id_sub = 1
    -> HAVING id_user = 1;

它查询我想要的:

+---------+----------+---------------+-------------+--------+--------------------+
| id_user | id_level | name          | jumlah_soal | id_sub | completed questions |
+---------+----------+---------------+-------------+--------+--------------------+
|       1 |        1 | Basic Level 1 |           5 |      1 |                  2 |
|       1 |        2 | Basic Level 2 |           6 |      1 |                  3 |
|       1 |        3 | Basic Level 3 |           7 |      1 |                  0 |
+---------+----------+---------------+-------------+--------+--------------------+

但是,当我尝试更改为查询用户 ID = 2 的进度时,它变成了这样:

+---------+----------+---------------+-------------+--------+--------------------+
| id_user | id_level | name          | jumlah_soal | id_sub | completed questions |
+---------+----------+---------------+-------------+--------+--------------------+
|       2 |        1 | Basic Level 1 |           5 |      1 |                  2 |
|       2 |        3 | Basic Level 3 |           7 |      1 |                  0 |
+---------+----------+---------------+-------------+--------+--------------------+

是的,Basic Level 2 没有了,因为用户 2 还没有完成,但用户 1 完成了。 这就是我卡住的地方,我想无论我选择哪个用户,它总是查询所有级别,即使其他用户已经完成了。应该是这样的:

+---------+----------+---------------+-------------+--------+--------------------+
| id_user | id_level | name          | jumlah_soal | id_sub | completed questions |
+---------+----------+---------------+-------------+--------+--------------------+
|       2 |        1 | Basic Level 1 |           5 |      1 |                  2 |
|       2 |        2 | Basic Level 2 |           6 |      1 |                  0 |
|       2 |        3 | Basic Level 3 |           7 |      1 |                  0 |
+---------+----------+---------------+-------------+--------+--------------------+

我该如何实现? 提前致谢,抱歉,如果您对我的解释或数据库感到头晕,我会尽力翻译它,所以它是可以理解的

我不太确定我是否理解要求,但我认为您正在寻找这样的东西...

SELECT l.*
     , 2 id_user
     , COALESCE(MAX(p.completed),0) completed_questions 
  FROM level l 
  LEFT 
  JOIN progress p 
    ON p.id_level = l.id_level 
   AND p.id_user = 2 
 WHERE l.id_sub = 1 
 GROUP 
    BY l.id_level;