首页 > 解决方案 > 为什么我的sql语句多次返回相同的输出

问题描述

大家见鬼。

我做了一个 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

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

如果有人知道我该如何解决这个问题

谢谢你

标签: sqljoinmariadb

解决方案


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

在你的 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 包含 true 和 false 你会得到:

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 子句)


推荐阅读