我正试图找到一种方法来正确地编写查询,以获得学生对每个问题的答案。我不太擅长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
(必须自己计算根据分页获得偏移量(
若下一页并没有数据,那个么停止执行查询。