Rails SQL查询计数
我有一个叫做Books的表格,它有很多章节,我想得到所有超过10章的书。如何在单个查询中实现这一点 到目前为止我有这个Rails SQL查询计数,sql,ruby-on-rails,ruby,Sql,Ruby On Rails,Ruby,我有一个叫做Books的表格,它有很多章节,我想得到所有超过10章的书。如何在单个查询中实现这一点 到目前为止我有这个 Books.joins('LEFT JOIN chapters ON chapters.book_id = books.id') 我不太了解rails,但SQL是这样的: SELECT b.* FROM Books b JOIN Chapters c ON b.id = c.book_id GROUP BY b.id HAVING COUNT(*) > 10 根据
Books.joins('LEFT JOIN chapters ON chapters.book_id = books.id')
我不太了解rails,但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')
更新:我知道了。这里是我在rails中所做的,如果它对任何人都有帮助的话
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)
找到了解决方案
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)
下面是使用Rails4、ActiveRecord的查询
Book.includes(:chapters).references(:chapters).group('books.id').having('count(chapters.id) > 10')
这对我不起作用,因为我无法处理数据。它需要一个select或where子句,因为当我这样做时:Books.joins:chapters.group'Books.id'。具有'count>10'。update_alllong_book:true它会更新所有的书籍,而不是通过group By选择的书籍。你确定吗?全部更新。你能粘贴生成的SQL吗?所以经过一点研究后,不能在update语句中使用GROUPBY。这就是我得到的:更新书籍加入章节上的章节。book\u id=books.id设置为long\u book=true。。。注意,它省去了分组,你能让它在两个过程中工作吗?强制组进行评估,然后运行更新?基本上,您希望接收所有图书id,然后在批处理过程中更新所有这些图书。因此,我取得了以下成果:更新图书b SET long_book=true,其中b.id in SELECT books.id FROM books JOIN chapters ON chapters.book_id=books.id GROUP BY books.id HAVING countchapters.id>10;但我得到了这样的结果:错误1093 HY000:您不能在FROM子句中为update指定目标表“b”