从孙子表中检索记录

时间:2011-02-26 19:56:23

标签: mysql sql database activerecord

我的问题是Rails相关,但即使是通用的SQL答案也会有用。

我正在处理四个表:类别,书籍,类别书籍和食谱。类别拥有并且属于许多书籍。书籍有很多食谱。

在Rails的代码中翻译我:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :books
end

class Book < ActiveRecord::Base
  has_and_belongs_to_many :categories
  has_many :recipes
end

class Recipe < ActiveRecord::Base
  belongs_to :book
end

我正在尝试检索属于给定类别的图书中包含的所有食谱。

我知道如何使用许多查询执行此操作,但不能使用单个查询。我会做很多查询:

recipes = []    
books = @category.books
books.each do |book|
  recipes << book.recipes.flatten
end

我不喜欢它,因为它需要N + 1个查询。我可能需要一个连接来同时完成所有操作,但我不确定ActiveRecord或SQL中的语法。我正在使用MySQL。

2 个答案:

答案 0 :(得分:1)

无法帮助Ruby。一般的SQL答案(对列名做出一些假设)将是:

SELECT Recipe.*
FROM Recipe
INNER JOIN Book ON Recipe.Book = Book.Id
INNER JOIN Category ON Book.Category = Category.Id
WHERE Category.Id = ?

编辑添加了另一个版本的查询,以匹配Pinky Brain关于表格和列的新信息。像这样的东西?

SELECT Recipe.*
FROM Recipe
INNER JOIN Categories_Books ON Categories_Books.book_id = Recipe.book_id
WHERE Categories_Books.category_id = ?

答案 1 :(得分:0)

假设有以下表结构...

category(
   category_id primary key
)

book(
   book_id primary key
)

recipes(
   recipe_id
  ,book_id
  ,primary key(recipe_id)  
)

categories_books(
   category_id
  ,book_id
  ,primary key(category_id, book_id)
)

...您可以通过以下查询获得所需内容,该查询将返回指定类别中所有图书的所有评论。

select ...
  from categories_books c
  join book             b using(book_id)
  join recipes          r using(book_id)
 where c.category_id = ?;

请注意,如果您不需要表中的任何数据,则可以将联接放弃到book,因为您可以通过{{1}直接从categories_books加入recipes }。另外,请确保book_id

上有(非唯一)索引