连接嵌套报表的三个表



我正试图找到一种方法来正确地编写查询,以获得学生对每个问题的答案。我不太擅长SQL,所以我很感激任何帮助。这是我在PHP/MySQL中构建的学生报告

首先,我有一个存储问题的question_table。结构为:

id
question

然后我有一张学生表,上面有学生的详细信息。结构为

id
student_name

然后我有一个答案表,其中包含每个question_id和student_id。结构为:

id
question_id
student_id
answer

我想为每个列出的问题创建一个报告。它显示了每个学生的答案。类似于:

Question: What is the name of the largest planet in the Solar System
Student A: Jupiter
Student B: Jupiter
Student C: Saturn

我尝试了以下操作,但操作不正确…:

select * from question, student
inner join answer
where answer.question_id = question.id

另一个挑战是报告应该分页。所以每页前20个问题。如果一个问题有多个学生答案,那么计数会更多,我不确定如何正确地分页:(

您似乎想要两个联接。这为每个问题/学生提供了一行:

select q.question, s.student_name, a.answer
from answers a
inner join questions q on q.id = a.question_id
inner join students s on s.id = a.student_id
order by q.id, s.id

您可以使用窗口函数(MySQL 8.0中提供(来实现分页逻辑:

select *
from (
select q.question, s.student_name, a.answer,
dense_rank() over(order by q.id) rn
from answers a
inner join questions q on q.id = a.question_id
inner join students s on s.id = a.student_id
) t
where rn between ? and ?
order by q.id, s.id

这两个问号代表你想要的问题范围。第一个问题具有索引1,依此类推

对于分页逻辑,您必须使用LIMIT关键字。您的服务器版本支持它
查询类似:

SELECT q.question, s.student_name, a.answer
FROM answers a
INNER JOIN questions q ON q.id = a.question_id
INNER JOIN students s ON s.id = a.student_id
ORDER BY q.id, s.id LIMIT 0,20  

现在,您将获得0到20的记录。

使用它,你必须指定有更多的数据要获取。如果是,那么调用下一页和你的LIMIT 20,20(必须自己计算根据分页获得偏移量(

若下一页并没有数据,那个么停止执行查询。

最新更新