SQL 中的 JOIN 或子查询以从所需的各种表中获取数据
JOIN or subquery in SQL to grab data out of various tables needed
我需要使用 PHP prepared statements
和 MySQL
从各种 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
首先你不需要questionnaire
table得到questionnaireID
-questionnaireQuestions
包含它可以直接link编辑到 studentAnswer
。其次,您不需要 students
table 来获得 studentID
,因为 studentAnswer
包含它。所以你可以简单地遵循这个逻辑:
- 你可以从
questionnaireQuestions
得到 questionnaireID
- 您可以 link
questionnaireQuestions
与 studentAnswer
通过 questionID
得到 answer
和 studentID
这将我们带到两个 table 的简单连接:
SELECT sa.studentID, qq.questionnaireID, sa.answer
FROM studentAnswer sa
INNER JOIN questionnaireQuestions qq
ON qq.questionID = sa.questionID
重点是 - 始终寻找提取数据的最短路线。如果可以避免,不要涉及任何额外的 table。这是您的图表将派上用场的地方。看一下,可以看到questionnaireQuestions
比questionnaire
到studentAnswer
"closer"(连接少了一步)。由于它包含您需要的数据,因此在 questionnaire
.
上使用它是合乎逻辑的
现在假设您需要 questionnaireName
以及学生的 firstName
和 lastName
。即使您不能直接将 questionnaire
加入 student
,您也可以通过 questionnaireQuestions
和 studentAnswers
来完成。联接可以包含您未从中选择的 table - 这是一种连接数据的机制。然后你会遵循这个逻辑:
- 你可以从
questionnaire
得到 questionnaireName
- 你可以 link
questionnaire
到 questionnaireQuestions
通过 questionnaireID
- 你可以 link
questionnaireQuestions
到 studentAnswer
通过 questionID
- 你可以 link
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
我需要使用 PHP prepared statements
和 MySQL
从各种 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
首先你不需要questionnaire
table得到questionnaireID
-questionnaireQuestions
包含它可以直接link编辑到 studentAnswer
。其次,您不需要 students
table 来获得 studentID
,因为 studentAnswer
包含它。所以你可以简单地遵循这个逻辑:
- 你可以从
questionnaireQuestions
得到 - 您可以 link
questionnaireQuestions
与studentAnswer
通过questionID
得到answer
和studentID
questionnaireID
这将我们带到两个 table 的简单连接:
SELECT sa.studentID, qq.questionnaireID, sa.answer
FROM studentAnswer sa
INNER JOIN questionnaireQuestions qq
ON qq.questionID = sa.questionID
重点是 - 始终寻找提取数据的最短路线。如果可以避免,不要涉及任何额外的 table。这是您的图表将派上用场的地方。看一下,可以看到questionnaireQuestions
比questionnaire
到studentAnswer
"closer"(连接少了一步)。由于它包含您需要的数据,因此在 questionnaire
.
现在假设您需要 questionnaireName
以及学生的 firstName
和 lastName
。即使您不能直接将 questionnaire
加入 student
,您也可以通过 questionnaireQuestions
和 studentAnswers
来完成。联接可以包含您未从中选择的 table - 这是一种连接数据的机制。然后你会遵循这个逻辑:
- 你可以从
questionnaire
得到 - 你可以 link
questionnaire
到questionnaireQuestions
通过questionnaireID
- 你可以 link
questionnaireQuestions
到studentAnswer
通过questionID
- 你可以 link
studentAnswer
到student
通过studentID
questionnaireName
这给我们带来了这样的查询:
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