代码之家  ›  专栏  ›  技术社区  ›  user2725109

两个左外部联接查询不明确的列名

  •  0
  • user2725109  · 技术社区  · 11 年前

    我正在为一个“问答”论坛制作rails 4应用程序。我有一个模型Micropost。我有一个模型QuestionAnswer,它将不同的微柱作为问题和答案连接起来:

    Class Micropost < ActiveRecord::Base
      has_many question_answers, foreign_key: "question_id"
      has_many answers, through: :question_answers
      has_one :reverse_question_answer, foreign_key: "answer_id", class_name: "QuestionAnswer"
      has_one :question, through: :reverse_question_answer
    end
    
    Class QuestionAnswer < ActiveRecord::Base
      belongs_to :question, class_name: "Micropost"
      belongs_to :answer,   class_name: "Micropost"
    end
    

    现在我想做一个数据库查询。我想使用两个LEFT OUTER JOIN来创建一个包含所有问题和答案的联合表:

    Micropost.
      joins('LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id').
      joins('LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id')
    

    我收到错误消息

    SQLite3::SQLException: ambiguous column name: microposts.id SELECT "microposts".* FROM "microposts" LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id ORDER BY created_at DESC
    

    我在上面的第二个joins命令中用答案替换了micropost,但它抱怨没有这样的表。我如何进行两次联接-谢谢

    1 回复  |  直到 11 年前
        1
  •  3
  •   Community Lee Campbell    7 年前

    解决方案是使用以下代码:

    Micropost.
      joins('LEFT OUTER JOIN question_answers a ON a.question_id = microposts.id').
      joins('LEFT OUTER JOIN microposts m ON m.id = a.answer_id')
    

    根据您关于别名的问题 a 别名代表整体 question_answers 桌子在这个特定的例子中,这只是为了方便。然而 m 别名,用于 microposts ,不是。

    在这里我们定义 是的别名 微柱 表,以表明它与您在使用之前要加入的表不同 a.question_id = microposts.id (这里的微柱是 微柱 表,然后在下一个JOIN中定义另一个实例 别名)。

    不确定我是否解释清楚,请看这里:

    SELECT e.name, mgr.name
      FROM employees e
        JOIN employees mgr ON (e.manager_id = mgr.id)
    ;
    

    在这里,我们又有了employees表的两个实例——我们将两个表中的行连接起来,以获得employee的名字和他的经理的名字。这里需要别名,因为否则将不清楚从哪个表中提取哪一列。

    如果你想了解更多关于JOIN的信息,你可以阅读:

    http://www.w3schools.com/sql/sql_join.asp

    或者(还有更多关于JOIN的链接,很好地展示和解释了,希望它对您有用):

    What is the difference between "INNER JOIN" and "OUTER JOIN"?