联接查询不适用于表中的所有元素

Posted

技术标签:

【中文标题】联接查询不适用于表中的所有元素【英文标题】:Join query not working properly for all the elements in the table 【发布时间】:2018-05-27 12:19:14 【问题描述】:

这是我的问题,我有两个表科目和成绩。

  CREATE TABLE `grades` (
  `gradesID` int(11) NOT NULL,
  `studentBook` int(11) DEFAULT NULL,
  `subjectID` varchar(5) DEFAULT NULL,
  `grade` int(5) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `grades` (`gradesID`, `studentBook`, `subjectID`, `grade`) VALUES
(1, 1034, 'AD356', 9),
(2, 1034, 'CS102', 10),
(3, 1034, 'CS103', 9),
(4, 1034, 'CS220', 5)

CREATE TABLE `subjects` (
  `subjectID` varchar(5) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `espb` smallint(6) DEFAULT NULL,
  `number_of_classes_per_week` smallint(6) DEFAULT NULL,
  `number_of_practices_per_week` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `subjects`
--

INSERT INTO `subjects` (`subjectID`, `name`, `espb`, `number_of_classes_per_week`, `number_of_practices_per_week`) VALUES
('AD356', '3D modeling Maya', 10, 3, 3),
('CS101', 'Introduction to object-oriented programming', 10, 3, 4),
('CS102', 'JAVA 2', 10, 3, 4),
('CS103', 'Algorithms', 8, 3, 3),

我需要进行加入查询以查找所有科目的所有尝试参加考试的学生人数(无论他们通过或失败)。我需要显示结果: subject.subjectID,subjects.name,每个科目的课程和实践总数,参加考试的学生人数(无论通过或失败)。 所以这是我的尝试:

SELECT 
  subjects.subjectID,
  subjects.name,
  (subjects.number_of_classes_per_week+subjects.number_of_practices_per_week) AS 'Totall number of classes per week',
  COUNT(grades.subjectID) AS 'Number of students that tried to pass'
FROM 
  subjects,
  grades 
WHERE 
  subjects.subjectID = grades.subjectID AND 
  grade >= 5;

但我只得到第一个 subjectID 他该科目的班级数和所有科目的学生总数 我想要的结果是这样的:

subjectID     name                           Totall number of classes per week                      Number of students that tried to pass
AD356    3D modeling Maya                  6              10
CS101   Introduction to object-oriented programming 7      4
CS102  'JAVA 2'                            7               5   
CS103    Algorithms                        6               4

【问题讨论】:

请提供一些示例数据和预期输出。谢谢。 @MartinSchneider 我现在将编辑。请稍等 您有一个聚合函数COUNT(),但没有匹配的GROUP BY。添加GROUP BY 1, 2, 3 以使您的查询按结果集的前三列进行分组。如果您仍然有奇怪的结果,请告诉我们。 请提供索引。 【参考方案1】:

您需要告诉 mysql 要计数的内容 - 换句话说,应该使用哪个字段作为分组标识符来计数。

在您的情况下,这将是 subjectID,因为您想计算每个科目的所有成绩(成绩高于或等于 5)。

所以你需要在你的 WHERE 语句之后添加:

GROUP BY subjectID

然后你应该完成了。

【讨论】:

【参考方案2】:

您正在使用 count() 没有分组依据的聚合函数,因此 mysql 只返回一行。试试这个(它可能会帮助你):

SELECT 
  subjects.subjectID,
  subjects.name,
  (subjects.number_of_classes_per_week+subjects.number_of_practices_per_week) AS 'Totall number of classes per week',
  COUNT(distinct grades.studentBook) AS 'Number of students that tried to pass'
FROM 
  subjects
JOIN grades ON grades.subjectID = subjects.subjectID
GROUP BY subjects.subjectID

【讨论】:

以上是关于联接查询不适用于表中的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

带有内部联接的 SQL 更新查询语法

联接表中的 JPQL 查询

如何在两个表之间创建正确的联接?

优化按联接表中的字段对结果进行分组的查询

如何在单个查询中使用联接和聚合函数更新表中的多行

Access SQL 中的联接语句