Соединить две/три таблицы, сохраняя все записи всех таблиц

Рейтинг: 0Ответов: 1Опубликовано: 31.07.2023

На данный момент у меня есть две таблицы (третья добавиться позже).

Первая таблица под названием titles_quizes включает в себя все существуещие экзамены в базе данных:

Title_QuizID Title SubjectID Draft
32 Basic 104 0
35 Prof 104 0
37 123123 89 1
38 123123123 104 0

Вторая таблица под названием savged_quizes включает в себя экзамены которые сохранил для себя пользователь:

savedQuizID Title_QuizID UserID Title_Name
1 38 19 123123123
2 35 19 Prof

На странице экзаменов (например все экзамены у которых SubjectID=104) я хочу вывести все экзамены и выделить те что сохранены у данного юзера.

Например:

Title_QuizID Title SubjectID Draft savedQuizID UserID
32 Basic 104 0 null null
35 Prof 104 0 2 19
37 123123 89 1 null null
38 123123123 104 0 1 19

Есть ли возможность создать такую таблицу или соединить две таблицы в одну.

На данный момент я попробовала использовать следующий запрос:

SELECT * FROM titles_quizes LEFT JOIN savged_quizes ON titles_quizes.Title_QuizID = savged_quizes.Title_QuizID

Данный запрос возвращает мне следущую таблицу:

Title_QuizID Title SubjectID Draft savedQuizID Title_QuizID UserID Title_Name
32 Basic 104 0 null null null null
35 Prof 104 0 2 35 19 Prof
37 123123 89 1 null null null null
38 123123123 104 0 1 38 19 123123123

Запрос

SELECT 
titles_quizes.Title_QuizID,
titles_quizes.Title,
titles_quizes.SubjectID,
titles_quizes.Draft,
savged_quizes.savedQuizID,
savged_quizes.UserID
FROM titles_quizes LEFT JOIN savged_quizes ON titles_quizes.Title_QuizID = savged_quizes.Title_QuizID

Дает мне нужную мне таблицу с нужными мне даннами, но я хотела узнать как можно улучшить запрос. В случае есть мне нужно будет добавить или убрать другие столбцы, мне кажеться перечеслять их всех будет очень муторно и может создавать проблемы.

Ответы

▲ 1

Существует несколько вариантов синтаксиса связывания.

Вы хотите, чтобы не было дублирования полей, используемых для связи? Тогда используйте либо JOIN .. USING, либо NATURAL JOIN.

В случае NATURAL JOIN таблицы связываются по всем одноимённым полям. В случае JOIN .. USING - только по тем, которые указываются. В обоих случаях поля связывания включаются в выходной набор только один раз. В случае внешнего связывания (LEFT JOIN) значения берутся из левой таблицы (для RIGHT JOIN - соответственно из правой).

Поля связывания помещаются в самое начало выходной структуры. Если обращаться к полям по имени, это не составляет проблемы.

То есть Вы можете использовать запрос

SELECT * 
FROM titles_quizes 
LEFT JOIN savged_quizes USING (Title_QuizID)

Впрочем, я полностью согласен с комментарием

перечеслять их всех будет очень муторно - это правильный подход, так и надо делать. – Alexander Petrov

Небольшое облегчение на стадии разработки может аукнуться большими проблемами в будущем.

PS. Я вообще считаю, что звезда вместо списка полей должна использоваться только в COUNT(*).