数据库
首页 > 数据库> > mysql-为什么两个左连接在一个查询中导致错误?

mysql-为什么两个左连接在一个查询中导致错误?

作者:互联网

注意:如果您正在寻找自己的问题的解决方案并且被画在这里,它可能对您没有帮助.除非您正在分析一个SQL查询中的错误,而实际上该错误可能存在于其后的查询中(您并不知道),否则这个问题对您没有帮助.我现在只是警告您,因为此问题中提供的所有数据均未找到答案.

为了扩展数据库表regular_rules而无需修改表本身,我创建了一个附加表(extended_rules),其PK对regular_rules也是FK.然后,我可以将任何新列放在extended_rules中,然后每当我从中加载记录时,我只需要将其与regular_rules结合起来就可以将其视为完整对象.因此,如您所见,这两个表共享一对一的关系.

但是,regular_rules与另一个表(rule_coupons)也具有一对多关系,该表也需要连接.

因此,我有以下查询:

SELECT `main_table`.*, `primary_coupon`.`code`, `regular_rules`.*
FROM `extended_rules` AS `main_table`
LEFT JOIN `rule_coupons` AS `primary_coupon`
    ON main_table.rule_id = primary_coupon.rule_id AND primary_coupon.is_primary = 1
LEFT JOIN `regular_rules`
    ON `main_table`.`rule_id` = `regular_rules`.`rule_id`

这对我来说似乎很好.但是,我收到以下错误信息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘main_table.rule_id’ in ‘on clause’

通过测试,我发现该错误在第二个联接上发生,尽管我刚刚在同一查询中不久就成功访问了main_table.rule_id.有趣的是,如果我交换两个联接,则第二个联接仍会发生错误,这使我相信这可能不是逻辑错误,而是语法错误,与我完全不了解的东西有关.

请注意,我不能随意修改第一个联接(在rule_coupons上),并且只能修改第二个联接(在regular_rules上)或向查询添加新部分.

编辑:有趣的发展…如果我将查询粘贴到phpMyAdmin并在那里执行它,它工作正常.我还整理了一个快速的基本PHP脚本,以使用mysqli执行查询,并且效果很好.到目前为止,它似乎只发生在我要构建的平台范围内(Magento).我已经与Magento一起工作了很长时间,而且之前从未遇到过像这样的奇怪数据库问题…所以我仍然不确定出什么问题,但是至少现在您有了更多的背景信息.

解决方法:

只是一个猜测:尝试省略表别名,并在ON子句周围设置方括号:

SELECT `extended_rules`.*, `rule_coupons`.`code`, `regular_rules`.*
FROM `extended_rules`
LEFT JOIN `rule_coupons`
    ON (extended_rules.rule_id = rule_coupons.rule_id AND rule_coupons.is_primary = 1)
LEFT JOIN `regular_rules`
    ON (`extended_rules`.`rule_id` = `regular_rules`.`rule_id`)

如果这行得通,那就是我多次观察到的错误:如果对某些表而不是对所有表使用别名,MySQL似乎有问题.否则,请忽略我写的内容;-)

标签:magento,join,left-join,mysql
来源: https://codeday.me/bug/20191208/2090463.html