SQL 中的 JOIN 或子查询以从所需的各种表中获取数据

JOIN or subquery in SQL to grab data out of various tables needed

我需要使用 PHP prepared statementsMySQL 从各种 table 中提取一些数据。

我需要将数据绘制成图表的项目是:

tblstudent.studentID tblquestionnaire.questionnaireID tblstudentAnswer.answer

我的 table 连接的数据库设计看起来像这样。

我曾尝试使用 INNER JOIN,但是我无法将 tblquestionnaire 加入其中,因为我不与 table 和 student 共享密钥table 或 studentAnswer table.

任何关于我如何在 SQL 查询中获取这些信息的指导将不胜感激。

你想多了

获取所有学生 ID、他们的答案和问卷 ID。

下面的查询就够了。

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

首先你不需要questionnairetable得到questionnaireID-questionnaireQuestions包含它可以直接link编辑到 studentAnswer。其次,您不需要 students table 来获得 studentID,因为 studentAnswer 包含它。所以你可以简单地遵循这个逻辑:

  • 你可以从 questionnaireQuestions
  • 得到 questionnaireID
  • 您可以 link questionnaireQuestionsstudentAnswer 通过 questionID 得到 answerstudentID

这将我们带到两个 table 的简单连接:

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

重点是 - 始终寻找提取数据的最短路线。如果可以避免,不要涉及任何额外的 table。这是您的图表将派上用场的地方。看一下,可以看到questionnaireQuestionsquestionnairestudentAnswer"closer"(连接少了一步)。由于它包含您需要的数据,因此在 questionnaire.

上使用它是合乎逻辑的

现在假设您需要 questionnaireName 以及学生的 firstNamelastName。即使您不能直接将 questionnaire 加入 student,您也可以通过 questionnaireQuestionsstudentAnswers 来完成。联接可以包含您未从中选择的 table - 这是一种连接数据的机制。然后你会遵循这个逻辑:

  • 你可以从 questionnaire
  • 得到 questionnaireName
  • 你可以 link questionnairequestionnaireQuestions 通过 questionnaireID
  • 你可以 link questionnaireQuestionsstudentAnswer 通过 questionID
  • 你可以 link studentAnswerstudent 通过 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