【问题标题】:Why are 2 left joins in one query causing an error?为什么一个查询中有 2 个左连接会导致错误?
【发布时间】:2011-09-12 01:59:21
【问题描述】:

注意:如果您正在为自己的问题寻找解决方案并且被吸引到这里,那么它可能对您没有帮助。除非您正在分析该错误的一个 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]:找不到列:1054 'on 子句'中的未知列 'main_table.rule_id'

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

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

编辑: 有趣的开发...如果我将查询粘贴到 phpMyAdmin 并在那里执行,它工作正常。我还拼凑了一个快速、基本的 PHP 脚本来使用 mysqli 执行查询,效果很好。到目前为止,它似乎只发生在我正在构建的平台范围内 (Magento)。我与 Magento 合作了很长时间,以前从未遇到过像这样奇怪的数据库问题......所以我仍然不确定出了什么问题,但至少现在你有了更多的上下文。

【问题讨论】:

    标签: mysql magento join left-join


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回复!正如我在问题接近尾声时所说,我实际上无法修改 rules_coupons 加入作为解决方案,很遗憾,那是行不通的。不过,我确实尝试了您所说的内容,看看它是否会起作用,不幸的是,这不是错误。我还尝试为regular_rules 加入添加 一个别名,以便它们都有别名,但这仍然不起作用。 :(
    【解决方案2】:

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

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

    一旦我意识到这一点,我就研究了第二个查询,这就是问题的根源。这也解释了为什么似乎错误总是发生在查询中的“第二个”连接上,不管它是什么......错误只是发生在我正在分析的查询之后

    所有这一切都是说,我在问题中提供的信息无法可能导致答案,因为我一开始就不正确。对于试图找出答案并浪费时间的任何人,我深表歉意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 2011-02-13
      相关资源
      最近更新 更多