为了账号安全,请及时绑定邮箱和手机立即绑定

在查询中混合ANSI 1992 JOIN和COMMA

在查询中混合ANSI 1992 JOIN和COMMA

呼唤远方 2019-10-12 13:44:08
我正在尝试以下MySQL查询来获取一些数据:SELECT m.*, t.*FROM memebers as m, telephone as tINNER JOIN memeberFunctions as mf ON m.id = mf.memeberINNER JOIN mitgliedTelephone as mt ON m.id = mt.memeberWHERE mf.function = 32但是我总是得到以下错误:#1054 - Unknown column 'm.id' in 'on clause'该列确实存在,并且查询仅适用于一个表(例如,当我卸下电话时)有人知道我做错了吗?
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

似乎您的要求是联接members表,但您正在联接telephone表。只是改变他们的顺序。


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`;

希望这对您有所帮助。谢谢!!


查看完整回答
反对 回复 2019-10-12
?
慕仙森

TA贡献1827条经验 获得超7个赞

根据此链接,建立连接时不应混用这两种符号。您用于加入的逗号  memebers as m, telephone as t以及对的后续调用inner join触发了未知列错误。


要处理它,请使用CROSS/INNER/LEFT JOIN而不是逗号。


以前,逗号运算符(,)和JOIN都具有相同的优先级,因此将联接表达式t1,t2 JOIN t3解释为((t1,t2)JOIN t3)。现在JOIN具有更高的优先级,因此该表达式被解释为(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

由于您尚未加入t和m,因此最终结果将是笛卡尔乘积;您可能希望对其进行修改。


希望对您有所帮助。


查看完整回答
反对 回复 2019-10-12
  • 2 回答
  • 0 关注
  • 523 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信