Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails SQL查询计数_Sql_Ruby On Rails_Ruby - Fatal编程技术网

Rails SQL查询计数

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的表格,它有很多章节,我想得到所有超过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”