存储过程的新手

New to Stored Procedures

手头的任务创建一个名为 MentoringCount() 的存储过程,它显示教授姓名和接受指导的学生人数输出需要按教授姓名排序,然后我需要创建第二个不需要的过程计算并需要显示没有指导的教授,我认为我可以导入大部分第一个程序并将 mentor =1 编辑为 mentor = 0

我目前坚持创建第一个程序,这是我在下面编写的代码我在包含“Order by professor.professorName”的行中收到错误我认为我是正确的轨道但是不完全确定我是不是或者我的代码是否一团糟

DELIMITER //
CREATE PROCEDURE MentoringCount()
 BEGIN
 SELECT 
     professor.ProfessorName,    
     (COUNT(student_professor.student_professor_id)) AS 'StudentNo'
 FROM professor
 LEFT JOIN student_professor
 ON student_professor.ProfessorId = professor.ProfessorId 
    AND student_professor.Mentor =1;
 ORDER BY professor.professorName
 END //
 DELIMITER;

下面是包含任务相关信息的表格

StudentProfessor Table
student_professor_id
ProfessorID
StudentNo
Mentor

professor Table
ProfessorID
ProfessorName

student Table
studentno

你的代码中有一个简单的语法错误,分号在语句的中间。

此外,您的查询可能只有 return 一行,因为您在未定义的聚合上使用了 COUNT() 聚合函数。使用此类函数时,应始终包含 GROUP BY 语句。 Mysql 有一个奇怪的默认行为,假设您想要对所有行进行分组而不是抛出错误消息。

DELIMITER //
CREATE PROCEDURE MentoringCount()
 BEGIN

 SELECT 
     professor.ProfessorName,    
     COUNT(student_professor.student_professor_id) AS 'StudentNo'
 FROM professor
 LEFT JOIN student_professor
 ON student_professor.ProfessorId = professor.ProfessorId 
    AND student_professor.Mentor = 1
 GROUP BY professor.professorName;

 END //
 DELIMITER;

关于 DELIMITER 的注释: 由于您需要在过程中存储完整的语句(以 ; 结尾),DELIMITER 将过程创建期间的字符序列更改为 //,因此 ; 中,过程作为文本处理,而不是 CREATE PROCEDURE 语句的一部分。

这就是语法错误仅在执行过程时出现而不是在创建过程时出现的原因。在创建期间,CREATE 语句的内部只是作为过程存储的一些(几乎)纯文本。它没有被解析。

编辑

你 select ALL 教授然后 LEFT JOIN 师徒关系。如果您只想查看匹配 Mentor = 1 的行,您可以将 ON 条件移动到 WHERE 子句,或者将 LEFT JOIN 切换到 INNER JOIN .

 SELECT .. FROM professor
 LEFT JOIN student_professor
      ON student_professor.ProfessorId = professor.ProfessorId 
 WHERE student_professor.Mentor = 1
 GROUP BY professor.professorName;

 SELECT .. FROM professor
 INNER JOIN student_professor
      ON student_professor.ProfessorId = professor.ProfessorId 
         AND student_professor.Mentor = 1
 GROUP BY professor.professorName;

如果您想了解原因,请查看文档中 INNERLEFT JOIN 之间的区别,以及 ONWHERE 子句之间的区别.