2014-03-06 46 views
2

我有一张名为“Books”的has_many“章节”表,我希望获得所有拥有超过10章的书籍。我如何在单个查询中执行此操作?Rails SQL查询计数

我有这个迄今为止...

Books.joins('LEFT JOIN chapters ON chapters.book_id = books.id') 

回答

0

找到了解决办法...

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) 
0

我不知道铁轨非常好,但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) 
+0

这不起作用对我而言,因为我无法对数据做任何事情。它需要选择或where子句的地方,因为当我这样做: Books.joins(:章) 。集团( 'books.id') .having( '计数()> 10') .update_all( long_book:true) 它更新所有的书籍,而不是通过组选择的书籍 – user3124172

+0

确定吗? 'update_all' [声称尊重条件](http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all)。你能粘贴生成的SQL吗? – Ben

+0

所以经过一番研究,不能在更新语句中使用group。 这是我得到: UPDATE'books' JOIN ON chapters.book_id = books.id设置章节'long_book' =真 ......注意,它被遗漏了的基和具有 – user3124172

1

下面是使用Rails 4查询,ActiveRecord的

Book.includes(:chapters).references(:chapters).group('books.id').having('count(chapters.id) > 10')