JOIN или подзапрос в SQL для извлечения данных из различных необходимых таблиц - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно вытащить некоторые данные из различных таблиц, используя PHP prepared statements и MySQL.

Элементы, которые мне нужны для построения графика в графике:

tblstudent. studentID tblquestionnaire. questionnaireID tblstudentAnswer. answer

Структура базы данных выглядит так с присоединениями моей таблицы. DB Design

Я пытался использовать INNER JOIN, но я не могу присоединиться к нему tblquestionnaire, так как у меня нет ключа с этой таблицей и student таблица или с таблицей studentAnswer.

Любое руководство будет высоко цениться в том, как я могу получить эти фрагменты информации в запросе SQL.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Прежде всего, вам не нужна таблица questionnaire, чтобы получить questionnaireID - questionnaireQuestions, содержащую ее, и она может быть напрямую связана с studentAnswer. Во-вторых, вам не нужна таблица students, чтобы получить studentID, потому что studentAnswer содержит ее. Таким образом, вы можете просто следовать этой логике c:

  • , вы можете получить questionnaireID из questionnaireQuestions
  • , вы можете связать questionnaireQuestions с studentAnswer через questionID чтобы получить answer и studentID

Это приводит нас к простому объединению двух таблиц:

SELECT sa.studentID, qq.questionnaireID, sa.answer
FROM studentAnswer sa
INNER JOIN questionnaireQuestions qq
ON qq.questionID = sa.questionID

Суть в том, чтобы всегда искать кратчайший маршрут для извлечения ваши данные. Не включайте никаких дополнительных таблиц, если этого можно избежать. Здесь ваша диаграмма пригодится. Глядя на это, вы можете видеть, что questionnaireQuestions «ближе» (на шаг меньше для подключения) к studentAnswer, чем questionnaire. Так как он содержит данные, которые вам нужны, логично использовать их над questionnaire.

Теперь предположим, что вам нужно questionnaireName вместе с firstName и lastName ученика. Даже если вы не можете напрямую присоединиться questionnaire к student, вы можете сделать это через questionnaireQuestions и studentAnswers. Объединения могут содержать таблицы, из которых вы не выбираете - это механизм соединения данных. Тогда вы будете следовать этой логике c:

  • , вы можете получить questionnaireName от questionnaire
  • , вы можете связать questionnaire с questionnaireQuestions через questionnaireID
  • Вы можете связать questionnaireQuestions с studentAnswer через questionID
  • Вы можете связать studentAnswer с student через studentID

Это приводит нас к такому запросу:

SELECT q.questionnaireName, s.firstName, s.lastName
FROM questionnaire q
INNER JOIN questionnaireQuestions qq ON qq.questionnaireID = q.questionnaireID
INNER JOIN studentAnswer sa ON qq.questionID = sa.questionID
INNER JOIN student s ON s.studentID = sa.studentID
1 голос
/ 10 апреля 2020

Вы обдумываете это.

, чтобы получить все студенческие идентификаторы, с их ответами и идентификатором вопросника.

Следующий запрос достаточно.

SELECT
    sta.studenID
    ,qq.questionnaireID
    ,sta.answer
FROM 
  studentAnswer sta
INNER JOIN 
    questionnaireQuestions qq ON sta.questionnID =  qq.questionnID
...