sql - 优化检索一段时间内项目计数的 SQL 查询

标签 sql ruby-on-rails ruby

有没有办法更好地优化这个函数中的查询?我希望它尽可能只进行一个 SQL 查询。该代码获取 2 周内生成的事件数。谢谢。

def items_chart_data
    @current_student = Student.find(current_user.student_id)
    (2.weeks.ago.to_date..DateTime.now).map do |date|
        {
            created_at: date,
            item_count: Item.where("date(created_at) = ? AND student_id = ?", date, @current_student.id).count
        }
    end
end

最佳答案

您可以在一个查询中执行此操作,如下所示:

items = Item.select('date(created_at) as date_created, count(id) as id_count').
          where('student_id = ? and created_at >= ?', current_user.student_id, 2.weeks.ago.beginning_of_day).
          group('date(created_at)').map do |item|
  { created_at: item.date_created, item_count: item.id_count }
end

要将包含 0 个项目的缺失日期放入数组中,您可以这样做:

(2.weeks.ago.to_date..Date.current).each do |date|
  date = date.strftime('%Y-%m-%d')

  unless items.any? { |h| h.value?(date) } # Check if date exists already
    items << { created_at: date, item_count: 0 } # Add item_count: 0 if not
  end
end

items.sort_by! { |h| h[:created_at] } # Put array in correct order

请注意,将零项天数添加到数组中不会执行任何查询。数组 items 仅包含 14 个元素,因此(特别是与查询数据库 14 次相比)这段代码应该非常快。

关于sql - 优化检索一段时间内项目计数的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18502952/

相关文章:

android - 在 Android Room 中如何创建和调用自定义查询

mysql - Sql Query 用于提取嵌入 php 的数据

Ruby 源代码分析器(类似于 pylint)

php - 如何在 postgresql 上将一个查询的输出作为另一个查询的输入?

ruby-on-rails - ruby 在 rails 上。搜查搜索协会

ruby-on-rails - 当前使用 Rails 构建 Facebook 应用程序的资源有哪些?

ruby-on-rails - 如何删除关键字段

ruby - 我如何从一组给定的值中进行选择,四舍五入?

java - Ruby 中的高级类 Java 枚举

java - PrintWriter 在下一行打印