我有一张名为“Books”的has_many“章节”表,我希望获得所有拥有超过10章的书籍。我如何在单个查询中执行此操作?Rails SQL查询计数
我有这个迄今为止...
Books.joins('LEFT JOIN chapters ON chapters.book_id = books.id')
我有一张名为“Books”的has_many“章节”表,我希望获得所有拥有超过10章的书籍。我如何在单个查询中执行此操作?Rails SQL查询计数
我有这个迄今为止...
Books.joins('LEFT JOIN chapters ON chapters.book_id = books.id')
找到了解决办法...
query = <<-SQL
UPDATE books AS b
INNER JOIN
(
SELECT books.id
FROM books
JOIN chapters ON chapters.book_id = books.id
GROUP BY books.id
HAVING count(chapters.id) > 10
) i
ON b.id = i.id
SET long_book = true;
SQL
ActiveRecord::Base.connection.execute(query)
我不知道铁轨非常好,但SQL会是这样:
SELECT b.* FROM Books b
JOIN Chapters c ON b.id = c.book_id
GROUP BY b.id
HAVING COUNT(*) > 10
根据ActiveRecord的文档它会然后是
Books.joins(:chapters)
.group('books.id')
.having('count() > 10')
更新:我想通了。在这里我所做的在轨如果它可以帮助任何人
query = <<-SQL
UPDATE books AS b
INNER JOIN
(
SELECT books.id
FROM books
JOIN chapters ON chapters.book_id = books.id
GROUP BY books.id
HAVING count(chapters.id) > 10
) i
ON b.id = i.id
SET long_book = true;
SQL
ActiveRecord::Base.connection.execute(query)
下面是使用Rails 4查询,ActiveRecord的
Book.includes(:chapters).references(:chapters).group('books.id').having('count(chapters.id) > 10')
这不起作用对我而言,因为我无法对数据做任何事情。它需要选择或where子句的地方,因为当我这样做: Books.joins(:章) 。集团( 'books.id') .having( '计数()> 10') .update_all( long_book:true) 它更新所有的书籍,而不是通过组选择的书籍 – user3124172
确定吗? 'update_all' [声称尊重条件](http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all)。你能粘贴生成的SQL吗? – Ben
所以经过一番研究,不能在更新语句中使用group。 这是我得到: UPDATE'books' JOIN ON chapters.book_id = books.id设置章节'long_book' =真 ......注意,它被遗漏了的基和具有 – user3124172