Получить все строки из таблицы1 и не существует в таблице2 с предложением множественного где - PullRequest
0 голосов
/ 24 января 2020

У меня есть онлайн-тест, где у меня есть две таблицы t1 (lvl_addition) таблица вопросов и t2 (student_answers) таблица ответов. t1 таблица содержит 100 сумм.

Ученик должен ответить на сумму один за другим, и каждый ответ будет сохранен в таблице t2 с использованием fk из t1

t1
-----
id
test_FK
modepaper_FK
sum1
sum2
...
answ (original answer)

t2
-----
id
t1_FK
student_FK
modelpaper_FK
answ (student answer)

modelpaper_FK is referred to the modelpaper table id, and student_FK is for the student_profiles id.

Экзамен основан на времени, если время заканчивается до того, как они закончат sh все 100 сумм. Экзамен останавливается, и в таблице t2 будут только отвеченные суммы.

Что ищет

Мне нужно вывести все 100 сумм из таблицы t1 (даже если не не существует в t2). Я использую предложение NOT EXIST, но проблема в том, что мне также нужно использовать предложение WHERE для ссылки t1.id = n AND t2.student_FK = n

Как я могу это сделать.

Приведенный ниже код дает мне только полученные суммы от t2.

SELECT t1.* 
FROM lvl_additions t1 
LEFT JOIN student_answers t2 ON t1.id = t2.lvladditions_FK
WHERE t1.modelpaper_FK = 59 AND t2.studentprofile_FK = 279

1 Ответ

1 голос
/ 24 января 2020

Как сказал Себастьян, проблема возникает из следующего условия:

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 студента, даже если в статье модели нет ответа на каждый вопрос. В этом случае вместо нулевого ответа будет отображаться текст.

  1. Существует более 4500 вопросов
  2. Вопросы «сгруппированы» по модели бумаги, каждая модель содержит 100 вопросов.
  3. Студент, возможно, ответил на все вопросы в модели бумаги

На основании этой информации, следующий запрос выполнил задание:

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 случая для различения:

  1. У студента заканчивается время, ответ равен нулю, а ctime равен нулю (ctime - это столбец в t2, который записывает Продолжительность)
  2. Студент пропускает вопрос, ответ нулевой, но 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...