我的问题是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。
答案 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