Как сказал Себастьян, проблема возникает из следующего условия:
t2.studentprofile_FK = 279
Что вам нужно сделать, это переместить это условие и любое другое условие в t2 прямо внутри левого оператора 'on' join. Смотрите запрос ниже:
SELECT t1.*, t2.*
FROM t1
LEFT JOIN t2 ON (t1.id = t2.t1_fk AND t2.student_id = 2)
И самое важное: СМОТРИТЕ ПОЛНУЮ ДЕМО ЗДЕСЬ
РЕДАКТИРОВАТЬ после обсуждения в чате:
ОП должен получать все вопросы / ответы к модели бумаги для конкретного c студента, даже если в статье модели нет ответа на каждый вопрос. В этом случае вместо нулевого ответа будет отображаться текст.
- Существует более 4500 вопросов
- Вопросы «сгруппированы» по модели бумаги, каждая модель содержит 100 вопросов.
- Студент, возможно, ответил на все вопросы в модели бумаги
На основании этой информации, следующий запрос выполнил задание:
SELECT
t1.*,
COALESCE(t2.answ, 'replacement text')
FROM lvl_additions t1
LEFT JOIN student_answers t2 ON (t1.id = t2.lvladditions_FK AND t2.studentprofile_FK = 279)
WHERE t1.modelpaper_fk = 59
РЕДАКТИРОВАТЬ 2:
Есть 2 случая для различения:
- У студента заканчивается время, ответ равен нулю, а ctime равен нулю (ctime - это столбец в t2, который записывает Продолжительность)
- Студент пропускает вопрос, ответ нулевой, но ctime - 00: 00: 00
Следующий запрос позволяет отображать различный текст для каждого случая:
SELECT
t1.*,
IF(t2.ctime IS NULL, 'time runs out', IF(t2.ctime = 0, 'question skipped', t2.answ)) AS answer
FROM lvl_additions t1
LEFT JOIN student_answers t2 ON (t1.id = t2.lvladditions_FK AND t2.studentprofile_FK = 279)
WHERE t1.modelpaper_fk = 59