为什么我的SQL语句多次返回相同的输出

时间:2019-06-08 11:51:12

标签: sql join mariadb

大家好。

我做了一个sql语句,该语句向我返回老师的姓名,他必须上课的时间以及所授课程的类型。我的陈述返回了我的期望,但多次返回相同的答案,为什么呢?我不太了解。

这是我的声明

SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id ,
unterichts_typ

我的输出

teacher1    teacher1    9:35    klavier
teacher2    teacher2    10:35   klavier
teacher1    teacher1    9:35    gittare
teacher2    teacher2    10:35   gittare
teacher1    teacher1    9:35    generell
teacher2    teacher2    10:35   generell
teacher1    teacher1    9:35    schlagzeug
teacher2    teacher2    10:35   schlagzeug
teacher1    teacher1    9:35    trombone
teacher2    teacher2    10:35   trombone
teacher1    teacher1    9:35    generell
teacher2    teacher2    10:35   generell

现在看到这个也并没有真正显示我想要的... 它会显示不正确的每种类型的类,该死的

如果有人知道我该如何解决

谢谢

1 个答案:

答案 0 :(得分:4)

您已经混合了联接样式并创建了笛卡尔乘积。笛卡尔积是行数增长的地方,因为不相关的行连接在一起。有时它很有用,但通常不是必需的

在sql语句的最后,您有一个逗号,然后是另一个表名

数据库已经使用INNER JOINed对表进行了工作,然后将表中的每一行与该表中的每一行进行合并

如果您打算将3个表连接在一起,请使用另一个内部连接语句

SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id
INNER JOIN unterichts_typ ON <<fill-this-on-clause-out>>

在过去,我们像这样联接表:

SELECT *
FROM a, b, c
WHERE a.id = b.id AND b.id = c.id

如果不使用WHERE子句,则db只会输出每个行组合。如果A包含1和2,B包含“ x”和“ y”,而c包含真和假,则您将得到:

1,x,true
1,x,false
1,y,true
1,y,false
2,x,true
2,x,false
2,y,true
2,y,false

现在,现代等效方法是使用INNER JOIN,而忘记ON子句(与使用where子句的旧方法相当)要困难得多,因为这样做是语法错误。但是db仍然允许旧方法,甚至允许混合。您的末尾带有“逗号表名”的语句是混合联接样式,这是生产笛卡尔乘积的旧方法(忘记了where子句)