【问题标题】:join three tables for nested report为嵌套报表连接三个表
【发布时间】:2021-01-07 01:26:38
【问题描述】:

我正在尝试找到一种方法来正确编写查询以获取学生对每个问题的答案。我对 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 个问题。如果一个问题有多个学生的答案,那么计数会更多,我不确定如何正确分页:(

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: php mysql sql inner-join window-functions


【解决方案1】:

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

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,以此类推。

【讨论】:

  • 谢谢先生!你也可以看看我编辑过的关于分页的问题吗?
  • 不幸的是我的服务器是版本 5... :(
【解决方案2】:

对于分页逻辑,您必须使用 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(必须自己计算根据分页获取偏移量)

如果没有下一页的数据,则停止执行查询。

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 2011-10-22
    • 2016-07-14
    • 1970-01-01
    • 2014-03-29
    • 2020-12-22
    • 2019-11-28
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多