【问题标题】:Mixing ANSI 1992 JOINs and COMMAs in a query在查询中混合使用 ANSI 1992 JOIN 和 COMMA
【发布时间】:2012-06-26 03:46:02
【问题描述】:

我正在尝试以下 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'

该列确实存在,并且查询仅适用于一个表(例如,当我删除电话时)

有人知道我做错了什么吗?

【问题讨论】:

  • 你有错字吗? “memebers”不是一个词,你的意思是“members”吗?这可以解释为什么 MySQL 抱怨在 m 中找不到 id
  • 电话表的连接条件是什么?现在这看起来像是 m+t 的完全连接,然后是两个表的内部连接
  • 尝试使用正确的连接语法。考虑到您不使用任何连接,电话表有什么用?

标签: mysql sql join inner-join


【解决方案1】:

根据this link,在建立连接时不应该混淆这两种表示法。您用于加入memebers as m, telephone as t 的逗号以及随后对inner join 的调用正在触发未知列错误。

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

以前,逗号运算符 (,) 和 JOIN 都具有相同的 优先级,所以连接表达式 t1, t2 JOIN t3 被解释为 ((t1, t2) 加入 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

由于您没有加入tm,因此最终结果将是笛卡尔积;您可能希望对其进行修改。

我希望它有所帮助。

【讨论】:

    【解决方案2】:

    您的要求似乎是加入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`;
    

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

    【讨论】:

    • 这是错误的答案。不要使用这种技术。您不应该混合使用隐式和显式连接。 @sebas 有正确答案。
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多