I have the following tables:
subjects
| id | title |
|---|---|
| subject_1 | Subject 1 |
| subject_2 | Subject 2 |
| subject_3 | Subject 3 |
tests
| id | title |
|---|---|
| test_1 | Test 1 |
| test_2 | Test 2 |
quizzes
| id | title |
|---|---|
| quiz_1 | Quiz 1 |
questions
| id | title |
|---|---|
| question_1 | Question 1 |
And junction tables:
subjects_tests
| subject | test |
|---|---|
| subject_1 | test_1 |
| subject_2 | test_2 |
subjects_quizzes
| subject | quiz |
|---|---|
| subject_3 | quiz_1 |
tests_questions
| test | question |
|---|---|
| test_1 | question_1 |
| test_2 | question_1 |
quizzes_questions
| quiz | question |
|---|---|
| quiz_1 | question_1 |
I know the question id. As a result I want to get:
| question.title | test.title | quiz.title | subject.title |
|---|---|---|---|
| Question 1 | Test 1 | null | Subject 1 |
| Question 1 | Test 2 | null | Subject 2 |
| Question 1 | null | Quiz 1 | Subject 3 |
How can this be achieved?
CodePudding user response:
select q.Title as questionTitle,
t.Title as testTitle,
null as quizTitle,
s.Title as subjectTitle
from questions q
inner join tests_questions tq on q.id = tq.question
inner join tests t on t.id = tq.test
inner join subjects_tests st on t.id = st.test
inner join subjects s on s.id = st.subject
-- where q.id = 'question_1'
union all
select q.Title as questionTitle,
null as testTitle,
qz.Title as quizTitle,
s.Title as subjectTitle
from questions q
inner join quizzes_questions qq on q.id = qq.question
inner join quizzes qz on qz.id = qq.quiz
inner join subjects_quizzes sq on qz.id = sq.quiz
inner join subjects s on s.id = sq.subject
-- where q.id = 'question_1'
;
CodePudding user response:
SELECT qn.title AS question.title,
t.title AS test.title,
qz.title AS quiz.title,
s.title AS subject.title
FROM questions AS qn
LEFT JOIN tests_questions AS tq ON qn.id = tq.question
LEFT JOIN tests AS t ON tq.test = t.id
LEFT JOIN quizzes_questions AS qq ON qn.id = qq.question
LEFT JOIN quizzes AS qz ON qz.id = qq.quiz
LEFT JOIN subjects_tests st AS t ON t.id = st.test
LEFT JOIN subjects AS s ON s.id = st.subject
