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



我正在为"问答"论坛制作一个rails 4应用程序。我有一个模型微帖子。我有一个模型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

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

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

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

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

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表。在这个特定示例中,这只是为了方便。但是,用于micropostsm别名不是。

在这里,我们定义mmicroposts表的别名,以表明它是与您在使用a.question_id = microposts.id之前连接的表不同的表(此处的微帖子是microposts表的第一个"实例",在下一个 JOIN 中,您定义另一个实例,您为其提供m别名(。

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

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

这里我们再次有两个员工表实例 - 我们连接两个表中的行以获取员工姓名及其经理姓名。此处需要别名,因为否则将不清楚从哪个表中获取哪一列。

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

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

或者(还有关于 JOIN 的进一步链接,很好地显示和解释,希望对您有用(:

">

内部连接"和"外部连接"有什么区别?

最新更新