ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-12-08 09:15:25  阅读:314  来源: 互联网

标签:magento join left-join 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有