从2个表中选择,使用JOIN并通过ID连接

Ele*_*len 0 mysql sql join

在这个主题的任何地方都很难搜索......基本上,我从两个表中选择,每个表都有JOIN子句.如果我按每个表分开查询,两者都工作正常...下面看起来逻辑上对我来说..但它给了我一个错误:

Error Code: 1054. Unknown column 'catalogue.ID' in 'on clause'  0.000 sec
Run Code Online (Sandbox Code Playgroud)

这个查询是否可行,我在这里缺少什么?

SELECT  `catalogue`.`ID`,`catalogue`.`Catalogue`,`catalogue`.`Artist`,`catalogue`.`Title`, `catalogue`.`Street_Date`,
        `label`.`label_name` as `label`,
        `format`.`format_name` as `Format`,
        `schedule`.designer,`schedule`.`MO`,

        `packtype`.`description` as `Package`,
        `manufacturer`.`description` as `Manufacturer`

        FROM `catalogue`, `manufacture`

        LEFT JOIN `schedule` ON (`schedule`.`cat_id` = `catalogue`.`ID`) 
        LEFT JOIN `label` ON (`catalogue`.`label` = `label`.`Lbl_ID`) 
        LEFT JOIN `format` ON (`catalogue`.`format` = `format`.`Fmt_ID`) 

        LEFT JOIN `packtype` ON `packtype`.`pack_id` = `manufacture`.`pack_id`
        LEFT JOIN `manufacturer` ON `manufacturer`.`man_id` = `manufacture`.`manuf`

    WHERE `catalogue`.`Street_Date`="2014-03-17" and  `manufacture`.`cat_id` = `catalogue`.`ID`

    ORDER BY  `catalogue`.`Catalogue`  asc LIMIT 1 , 10
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

你是混合join类型,所以这是你得到的问题之一.您可以通过更换解决这个问题,cross join:

    FROM `catalogue` cross join `manufacture`

    LEFT JOIN `schedule` ON (`schedule`.`cat_id` = `catalogue`.`ID`) 
    LEFT JOIN `label` ON (`catalogue`.`label` = `label`.`Lbl_ID`) 
    LEFT JOIN `format` ON (`catalogue`.`format` = `format`.`Fmt_ID`) 

    LEFT JOIN `packtype` ON `packtype`.`pack_id` = `manufacture`.`pack_id`
    LEFT JOIN `manufacturer` ON `manufacturer`.`man_id` = `manufacture`.`manuf`
Run Code Online (Sandbox Code Playgroud)

但是,令我惊讶的是join,这些表之间没有条件.

哦,我看到了这个状况where.呸!

    FROM `catalogue`
    LEFT JOIN `manufacture` ON `manufacture`.`cat_id` = `catalogue`.`ID`

    LEFT JOIN `schedule` ON (`schedule`.`cat_id` = `catalogue`.`ID`) 
    LEFT JOIN `label` ON (`catalogue`.`label` = `label`.`Lbl_ID`) 
    LEFT JOIN `format` ON (`catalogue`.`format` = `format`.`Fmt_ID`) 

    LEFT JOIN `packtype` ON `packtype`.`pack_id` = `manufacture`.`pack_id`
    LEFT JOIN `manufacturer` ON `manufacturer`.`man_id` = `manufacture`.`manuf`
Run Code Online (Sandbox Code Playgroud)

实际记录了这个问题:

但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT JOIN等.如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现'on子句'中未知列'col_name'形式的错误.有关处理此问题的信息将在本节后面给出.

简单的解决方案是:永远不要,from条款中使用.如果您想要交叉连接,请使用cross join.

  • 不能同意更多.你不想使用旧的`JOIN`语法.更重要的是,你绝对不应该将旧语法与新语法混合使用.我还建议使用别名来使您的代码更容易阅读. (2认同)