Yura_Mart
@Yura_Mart

Как правильно составить запрос?

Есть 2 таблицы
lesson:
id  |  id_course  |  lesson_title
    1  |          3       |      Урок 1
    2  |          3       |      Урок 2
    3  |          3       |      Урок 3
    4  |          4       |      Урок 4
    5  |          4       |      Урок 5

history:
id  |  id_lesson  |             email                |    date
  43  |          1       |     123@gmail.com      |    2018-07-09 13:17:05
  44  |          2       |     123@gmail.com      |    2018-07-09 13:18:05
  45  |          3       |     123@gmail.com      |    2018-07-09 13:19:05

Суть в чём, есть курсы, в них есть уроки
Разные пользователи проходят урок -> записывается история о том что он прошёл урок
Нужно сделать вывод людей, тех, кто полностью прошёл весь курс(т.е. все уроки в курсе). В каждом курсе свой вывод прошедших людей.
Вот мой запрос, но не то:
$query = "SELECT h.* FROM history h LEFT JOIN lesson l ON h.id_lesson = l.id WHERE l.id_course= '$id'";

Мне нужно чтобы выводило просто запись с email и датой, кто и когда закончил весь курс
По логике, как я думаю, нужно сверить кол-во записей в history с id уроков каждого пользователя и кол-во самих уроков в таблице lesson по их id конкретного курса -> и потом если эти кол-ва записей совпадают, то выводить их email.
Как правильно составить запрос? help me plz
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 1
@GilbertAmethyst
Немного смущает структура ваших таблиц, хорошо если это просто пример или какая-то часть логики не озвучена. Но вообще странно хранить в строках таблицы постоянно почту человека, не правильнее ли будет сделать столбец userId и в нём указывать id пользователя в таблице users где есть вся информация о нём? В общем ладно.

В вашем случае может быть что-то вроде:

SELECT COUNT(`id`) as history_user_count, `email`, MAX(`date`), (SELECT COUNT(id) FROM lesson WHERE id_course = '3' OR id_course = '4') as lessons FROM `history` WHERE 1 GROUP BY `email` HAVING lessons =< history_user_count
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы