Как выбрать каждый уровень с разным пользователем и пользовательским прогрессом

0

Я хотел сделать учебные приложения с завершенным отслеживанием прогресса на каждом уровне. У меня есть 2 таблицы, которые содержат весь уровень с его счетчиком вопросов, и таблицу, которая сохраняет прогресс пользователя (заполненные вопросы) на каждом уровне. Вот запись,

Таблица уровней:

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

Как мне это достичь? Спасибо заранее и извините, если у вас головокружение либо по моему объяснению, либо по базе данных, я изо всех сил старался перевести его, поэтому он понятен

  • 0
    Но почему id_user 2 появляется рядом с уровнем, который они еще не завершили!?!
  • 0
    Потому что мне нужно вывести весь уровень и прогресс, включая прогресс, который не был завершен пользователем, чтобы пользователь мог видеть, какой уровень он не завершил - @Strawberry
Теги:
database
outer-join

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;
  • 0
    Сказать спасибо запрещено при комментировании, но, сэр ... У меня огромное количество благодарностей, я так благодарен, что вы мне помогли ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню