Как выбрать каждый уровень с различным пользователем и пользовательским прогрессом - PullRequest
0 голосов
/ 20 мая 2018

Я хотел создать учебное приложение с треком прохождения заданных вопросов на каждом уровне.У меня есть 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 |
+---------+----------+---------------+-------------+--------+--------------------+

НО, когда я пытался изменить запрос на прогресс для пользователя с ИД = 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 |
+---------+----------+---------------+-------------+--------+--------------------+

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

1 Ответ

0 голосов
/ 20 мая 2018

Я не совсем уверен, что понимаю требование, но я думаю, что вы после чего-то вроде этого ...

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