在查询中混合ANSI 1992 JOIN和COMMA
我正在尝试以下MySQL查询来获取一些数据:
SELECT m.*, t.* FROM memebers as m, telephone as t INNER JOIN memeberFunctions as mf ON m.id = mf.memeber INNER JOIN mitgliedTelephone as mt ON m.id = mt.memeber WHERE mf.function = 32
但我总是得到以下错误:
#1054 - Unknown column 'm.id' in 'on clause'
该列确实存在,并且只有一个表的查询工作正常(例如,当我删除电话)
有人知道我做错了吗?
看来你的要求是joinmembers
表,但你jointelephone
表。 只是改变他们的顺序。
SELECT `m`.*, `t`.* FROM `memebers` AS `m` JOIN `telephone` AS `t` JOIN `memeberFunctions` AS `mf` ON `m`.`id` = `mf`.`memeber` AND `mf`.`function` = 32 JOIN `mitgliedTelephone` AS `mt` ON `m`.`id` = `mt`.`memeber`;
希望这可以帮助你。 谢谢!!
根据这个链接 ,在build立连接时不要混淆两个符号。 用来join成员的逗号memebers as m, telephone as t
,随后调用inner join
,会触发未知的列错误。
要处理它,请使用CROSS/INNER/LEFT JOIN
而不是逗号。
以前,逗号运算符(,)和JOIN都具有相同的优先级,所以连接expression式t1,t2 JOIN t3被解释为((t1,t2)JOIN t3)。 现在,JOIN具有更高的优先级,所以expression式被解释为(t1,(t2 JOIN t3))。 此更改会影响使用ON子句的语句,因为该子句只能引用连接的操作数中的列,优先级的更改会更改对这些操作数的解释。
为了教学目的,我想添加查询,我想应该是这样的:
SELECT m.*, t.* FROM memebers as m JOIN telephone as t JOIN memeberFunctions as mf ON m.id = mf.memeber AND mf.function = 32 JOIN mitgliedTelephone as mt ON m.id = mt.memeber
既然你不joint
和m
,最后的结果将是笛卡儿的产品。 你可能想要修改它。
我希望它帮助。