在查询中混合使用ANSI 1992 JOIN和COMMA

时间:2012-06-24 18:13:18

标签: mysql sql join inner-join

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

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

有人知道我做错了吗?

2 个答案:

答案 0 :(得分:15)

根据this link,在构建联接时不应混淆两种符号。您用来加入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

由于您未加入tm,因此最终结果将是笛卡尔积;你可能希望它被修改。

我希望它有所帮助。

答案 1 :(得分:-1)

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

希望这会对你有所帮助。谢谢!!