Получить запись из 1-й таблицы, которой нет во 2-й таблице mysql

У меня есть следующие записи в этих двух таблицах mysql.

Таблица-А

       Question_No 
           1
           2
           3
           4
           5

Таблица-Б

Roll_No  Question_No  Ans_Option
 1001      1         NULL 
 1001      2         D
 1001      3         NULL
 1002      1         C
 1002      2         NULL 

Здесь слово «NULL» явно вставлено в столбец, ничего не путать.

Как я могу отобразить следующий результат по запросу mysql?

       Questions not attempted by roll no 1001 are : 1, 3, 4, 5 
       Questions not attempted by roll no 1002 are : 2, 3, 4, 5 

Я пробовал со следующим кодом, но не работал

select distinct a.* from table_A a NATURAL LEFT JOIN table_B b where 
b.Question_No IS NULL and b.Roll_No=1001;// where I am wrong here ? I have 
not set any column as primary key , should I set?

Заранее большое спасибо

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы ставите условие WHERE на LEFT OUTER JOIN, это буквально то же самое, что и INNER JOIN:

select distinct a.* 
from table_A a 
NATURAL LEFT JOIN table_B b 
where b.Question_No IS NULL 
  and b.Roll_No=1001;  -- this condition makes it `NATURAL JOIN`

Вы можете переписать его как:

SELECT DISTINCT a.*
FROM table_A a
LEFT JOIN table_b b
  ON a.Question_No = b.Question_No
 AND b.Roll_No=1001
WHERE b.Ans_Option_No IS NULL

db<>демонстрация скрипки

спасибо за помощь, но я получаю значения для рулона № 1001: 3, 4, 5, как я могу получить 1, 3, 4, 5?

Tom 27.07.2019 19:52

@Том WHERE b.Ans_Option_No IS NULL1

Lukasz Szozda 27.07.2019 19:53

Хорошо, как я могу добавить «b.Question_No is NULL» вместе с приведенным выше кодом, который вы написали ранее?

Tom 27.07.2019 19:59

привет, я не получаю вопросы, которые Ans_No содержат значения NULL, я получаю вопросы 3, 4, 5, но не 1, 3, 4, 5

Tom 27.07.2019 20:14

@Tom Ты запустил код? dbfiddle.uk/…

Lukasz Szozda 27.07.2019 20:21

Я не установил какие-либо столбцы в качестве первичного ключа? Должен ли я установить Question_No в качестве первичного ключа в обеих таблицах?

Tom 27.07.2019 20:42

Большое спасибо, Лукаш, я получил это, добавив следующее условие: где b.Ans_Option_No IS NULL OR b.Ans_Option_No='NULL';

Tom 27.07.2019 20:54

Используйте cross join для создания строк, а затем отфильтруйте их:

select r.roll_no, b.Question_No
from (select distinct roll_no from b) r cross join
     a left join
     b
     on b.roll_no = r.roll_no and b.Question_No = a.Question_No
where b.roll_no is null;

Получается вопрос, который нет в b.

Большое спасибо за помощь ... этот запрос приведет к более быстрому результату или решению, предоставленному Лукашем?

Tom 27.07.2019 21:02

@ Том. . . Они реализуют разную логику. Я думаю, что это версия, которая вам действительно нужна.

Gordon Linoff 27.07.2019 23:01

Другие вопросы по теме