为什么在一个查询中有2个左连接导致错误?

时间:2011-06-09 21:42:31

标签: mysql magento join left-join

注意:如果您正在寻找自己的问题的解决方案而且您被吸引到这里,它可能对您没有帮助。除非你正在分析一个关于bug的SQL查询,否则实际上bug可能存在于跟随的查询中,你不知道,这个问题对你没有任何帮助。我现在只是警告你,因为这个问题中提供的数据实际上都没有得到答案。


为了扩展数据库表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]:找不到列:1054'on clause'中的未知列'main_table.rule_id'

通过测试,我发现在第二次连接时发生了这个错误,尽管我在同一个查询之前就已成功访问main_table.rule_id。有趣的是,如果我交换两个连接,错误仍然发生在第二个连接上,这使我相信它可能不是逻辑错误,而是语法错误,与我根本无法理解的东西有关。

请注意,我没有足够的修改第一个连接(到rule_coupons),我只能修改第二个连接(到regular_rules)或添加新的部分到查询

编辑:有趣的开发...如果我将查询粘贴到phpMyAdmin并在那里执行,它可以正常工作。我还将一个快速,基本的PHP脚本拼凑在一起,使用mysqli执行查询,并且运行正常。到目前为止,它似乎只发生在我正在建立的平台范围内(Magento)。我已经和Magento合作了很长时间,我以前从来没有遇到像这样的奇怪的数据库问题......所以我仍然不确定是什么问题,但至少现在你有更多的背景。 / p>

2 个答案:

答案 0 :(得分:2)

猜测:尝试省略表别名并在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似乎有问题。否则,只要忽略我写的东西; - )

答案 1 :(得分:1)

事实证明,我已将此问题跟踪到代码中的错误位置。

如您所见,SQL旨在返回结果集合,因为该查询的目的是填充网格。每当我尝试加载该网格时都会发生错误。不幸的是,我不知道其他人正在为我的查询返回的每一行执行另一个查询。

一旦我意识到这一点,我就调查了第二个查询,其中就是问题的根源。这也解释了为什么看起来好像错误总是发生在查询中的“第二个”连接中,无论它是什么......错误只是在我正在分析的查询之后发生! / p>

所有这一切都是说,我在问题中提供的信息不能可能导致答案,因为我开始时是不正确的。我向那些试图找出答案并浪费时间的人道歉。