大家好。
我做了一个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
现在看到这个也并没有真正显示我想要的... 它会显示不正确的每种类型的类,该死的
如果有人知道我该如何解决
谢谢
答案 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子句)