0

我有各种各样的桌子,比如

学生
主要ID,学生姓名,课程

文件
论文编号、论文名称、课程、学期、类型

学生选项
primary id、studentid(外键 - 参考学生 id)和 paperid(外键 - 参考论文 id)

学生学期
studentid(外键引用学生id)和学生学期

现在我想要的结果是,

我想选择一门课程然后是学期,这将给我论文/主题的数量及其类型(强制性/可选),并且我想计算从所有这些表格中学习这些论文的学生人数.

我不想创建任何视图或东西,只需一个普通的选择查询即可。

我正在运行的查询是:

SELECT p_name,
       p_id,
       type,
       Count(sps.studentid) AS counts
FROM   students,
       str,
       papers
       LEFT JOIN sps
              ON sps.paperid = papers.p_id
WHERE  sps.studentid = students.studentid
       AND students.studentid = str.studentid
       AND sps.studentid = str.studentid
       AND str.semesterid = p_semid
       AND str.sessionid = 12
       AND students.course = c_id
       AND c_id = 6
       AND p_semid = 1
GROUP  BY p_id 
4

1 回答 1

2

作为更好的做法,如果您要使用显式JOIN语法,则不要使用隐式语法。在您在上面发布的查询中,您选择 from papers,但您没有在任何地方使用它。此外,您的列名有点模棱两可。如果更容易,请使用单个字母为每个表命名,或显式为列名添加前缀。如果您使用带有 的聚合GROUP BY,则无法选择不在组中的列。

假设这是您的 ER 图:

让我们首先连接所有表:

SELECT a.id, a.name
FROM student a
JOIN str b ON b.student_id = a.id
JOIN sps c ON c.student_id = a.id
JOIN papers d ON d.id = c.paper_id

现在您希望查找从特定课程学习论文的学生人数并输入:

SELECT a.id, a.name
FROM student a
JOIN str b ON b.student_id = a.id
JOIN sps c ON c.student_id = a.id
JOIN papers d ON d.id = c.paper_id
WHERE b.semester = 12
    AND d.course = 6

因为您的属性不明确,所以很难分辨它们来自哪些表。如果您可以在SQL Fiddle上设置结构和示例数据,我们可以为您提供更好的帮助。

于 2012-10-29T19:27:16.823 回答