MySQL,通过单个交叉引用表进行多个关联

MySQL,通过单个交叉引用表进行多个关联,mysql,associations,cross-reference,Mysql,Associations,Cross Reference,简短版本:当我在一个联接表上设置条件时,它正在污染另一个使用不同别名的同一个表的联接,给我带来意想不到的结果 长版本:我可以用以下三个表演示该行为: 表1 创建表“学生” `id`int10不为空, `名称`varchar10不为空 ; 在'students``id`、`name`值中插入 1“索菲亚”; 表2 创建表“类” `id`int10不为空, `subject`varchar10不为空, `年份'varchar4不为空 ; 在'classes``id`、'subject`、'year`

简短版本:当我在一个联接表上设置条件时,它正在污染另一个使用不同别名的同一个表的联接,给我带来意想不到的结果

长版本:我可以用以下三个表演示该行为:

表1 创建表“学生” `id`int10不为空, `名称`varchar10不为空 ; 在'students``id`、`name`值中插入 1“索菲亚”; 表2 创建表“类” `id`int10不为空, `subject`varchar10不为空, `年份'varchar4不为空 ; 在'classes``id`、'subject`、'year`值中插入 1、‘数学’、‘2019’, 2、‘英语’、‘2020’, 3、‘德语’、‘2020’; 表3-交叉参考 创建表“班级学生” `id`int10不为空, `学生id`int10不为空, `class_id`int10不为空 ; 在'classes\u students``id`、'student\u id`、'classes\u id`值中插入 1, 1, 1, 2, 1, 2, 3, 1, 3; 如果我从Classes表上具有多个联接的Students表中选择,它可能如下所示:

选择S.id、S.name、GROUP_CONCATC20.subject、GROUP_CONCATC19.subject 来自学生的 左加入班级\u学生CS ON CS.student\u id=S.id 在CS.class_id=C20.id和C20.year='2020'上以C20的形式左键连接类 在CS.class_id=C19.id和C19.year='2019'上以C19的形式左连接类 其中1=1 按S.id分组 正如所料,这将返回Sophia的所有类:

id  name    GROUP_CONCAT(C20.subject)   GROUP_CONCAT(C19.subject)
1   Sophia  English,German              Math
但是,如果我想让每个在2020年学习英语和2019年学习数学的学生都学习英语,我会尝试使用这两个连接添加条件,例如,其中C20.subject='English'和C19.subject='Math',并且查询无法返回任何内容


这是怎么回事?除了有一个解决办法,我想更好地理解为什么这不起作用!必须根据条款将条件置于,而不是置于它使左连接内部的位置。谢谢你@Akina!这个策略可以用来获得预期的结果,但在我的实际应用程序中,它的性能非常差,因为我的实际应用程序更复杂,有16k名学生。我已经更新了原始问题,以澄清并包括潜在的解决方案。另外,感谢您提到左连接成为内部连接的想法。我以前从未见过这种情况,但我发现了另一个可以解决这个问题的问题:。这似乎是一种与我上面描述的不同的现象?