mysql - 如何选择具有不同用户和用户进度的每个级别

标签 mysql database outer-join

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

级别表:

+----------+----------------------+-------------+--------+
| 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 |
..........................................................

进度表:

+-----------------+---------+-------------+----------+
| id_progreslevel | id_user | completed   | id_level |
+-----------------+---------+-------------+----------+
|               1 |       1 |           2 |        1 |
|               2 |       1 |           3 |        2 |
|               3 |       2 |           2 |        1 |
+-----------------+---------+-------------+----------+
<小时/>

当我使用以下查询连接表时

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 |
+---------+----------+---------------+-------------+--------+--------------------+
<小时/>

是的,基本级别 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;

关于mysql - 如何选择具有不同用户和用户进度的每个级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50432960/

相关文章:

database - 在大型数据库中达到性能和可伸缩性之间的适当平衡

join - Linq to Entity有多个左外部联接

mysql - MySQL中如何满足条件时选择一行,不满足条件时选择另一行?

sql - 如何只选择一个表中包含另一个表中所有值的记录?

php - 在php中从电子邮件地址抓取网站

database - 从 BACPAC 文件恢复数据库时,我可以从 azure 中删除数据库吗?

php - 我想从 2 个不同的表进行连接查询,我想从两个表中输出

sql - 我误解了联接吗?

php - 一页查询请求过多

PHP mysql PDO更新查询,错误:bindParam() on a non-object