Mysql 同一个表上有多个左JOIN语句

Mysql 同一个表上有多个左JOIN语句,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我尝试多次在同一个表上左连接,以获取特定主题的所有值。它的工作原理和我想象的一样,见: 但是,使用上面的fiddle,数据库会为每个不同的课程返回一行。我想使用groupbypersonid对它们进行分组,但是对于所有其他列,它只接受第一个值(数学为6)和(null)值。见: 我需要做哪些更改才能获得每人一行,并将所有成绩填入各自的列中(如果可用)?MySQL允许您在选择中包含不在分组依据中的列。这实际上违反了ANSI标准,任何其他数据库都不支持(尽管在某些情况下ANSI标准允许)。结果是输出中

我尝试多次在同一个表上左连接,以获取特定主题的所有值。它的工作原理和我想象的一样,见:

但是,使用上面的fiddle,数据库会为每个不同的课程返回一行。我想使用
groupbypersonid
对它们进行分组,但是对于所有其他列,它只接受第一个值(数学为6)和
(null)
值。见:


我需要做哪些更改才能获得每人一行,并将所有成绩填入各自的列中(如果可用)?

MySQL允许您在
选择中包含不在
分组依据中的列。这实际上违反了ANSI标准,任何其他数据库都不支持(尽管在某些情况下ANSI标准允许)。结果是输出中单个行的值不确定

解决方案是聚合函数:

SELECT p.id AS PersonID, p.name AS PersonName,
       max(pc1.grade) AS Math,
       max(pc2.grade) AS Chemistry,
       max(pc3.grade) AS Physics
FROM Person p LEFT JOIN
     Person_Course pc
     on p.id = pc.user_id LEFT JOIN
     Course c on c.id = pc.course_id LEFT JOIN
     Person_Course pc1
     on pc1.id = pc.id AND pc1.course_id = 1 LEFT JOIN 
     Person_Course pc2
     on pc2.id = pc.id AND pc2.course_id = 2 LEFT JOIN 
     Person_Course pc3
     on pc3.id = pc.id AND pc3.course_id = 3 
GROUP BY PersonID;
如果人们可以多次参加同一课程,您可能需要
group\u concat()
。另外,不要对列名使用单引号。仅对字符串和日期常量使用它们

将课程ID硬连接到代码中似乎是个坏主意。我将更简单地使用条件聚合来编写:

SELECT p.id AS PersonID, p.name AS PersonName,
       max(case when c.name = 'Math' then pc.grade end) AS Math,
       max(case when c.name = 'Chemistry' then pc.grade end) AS Chemistry,
       max(case when c.name = 'Physics' then pc.grade end) AS Physics
FROM Person p LEFT JOIN
     Person_Course pc
     on p.id = pc.user_id LEFT JOIN
     Course c
     on c.id = pc.course_id
GROUP BY PersonID;

您还可以解释原因。它是有效的,用
max(…)
围绕选择值(等级)返回我想要的结果。关于您的解释:如果我在GROUPBY语句中添加所有这些值,它仍然会给出错误的结果?为什么聚集这些值可以解决这个问题?@Joetjah。因为您需要将多个不同的值组合成一行,而
max()
(或
group\u concat()
)是正确的方法。