【问题标题】:rails COUNT SELECT DISTINCTrails COUNT SELECT DISTINCT
【发布时间】:2018-05-14 23:18:12
【问题描述】:

我正在记录用户观看一系列视频的次数。现在我正在尝试制作每天观看任何视频的用户数量的图表。

UserVideoWatching.where("created_at >= ? AND user_id != ?",1.month.ago, User.elephant.id).group("DATE(created_at)").reorder('created_at').count

产生sql

SELECT COUNT(*) AS count_all, DATE(created_at) AS date_created_at FROM `user_video_watchings` WHERE (created_at >= '2013-01-27 10:43:24' AND user_id != 7) GROUP BY DATE(created_at) ORDER BY created_at

这会为每天观看的所有视频产生正确的结果,但正如我所说,我只想向每个用户显示一次。

我要的sql是

SELECT COUNT(DISTINCT user_id) AS count_all, DATE(created_at) AS date_created FROM `user_video_watchings` WHERE (created_at >= '2013-01-27 10:33:18' AND user_id != 7) GROUP BY DATE(created_at) ORDER BY created_at

原来如此

UserVideoWatching.where("created_at >= ? AND user_id != ?",1.month.ago, User.elephant.id).group("DATE(created_at)").reorder('created_at').select('COUNT(DISTINCT user_id) AS count_all, DATE(created_at) AS date_created')

会做我想做的事。但这给了

[#<UserVideoWatching >, #<UserVideoWatching >]

而不是散列。

有什么想法吗?

我正在使用 rails 3.1 和 mysql

【问题讨论】:

    标签: mysql ruby-on-rails count distinct


    【解决方案1】:

    您可以使用distinct.count(:attribute_name)

    (在 Rails 3 中使用:count(:user_id, distinct: true)

    因此:

    UserVideoWatching.where("created_at >= ? AND user_id != ?", 1.month.ago, User.elephant.id)
    .group("DATE(created_at)").reorder('created_at').distinct.count(:user_id)
    

    无法测试,但我认为这会产生您所追求的 SQL。

    【讨论】:

    • 在 rails 4 中已弃用,请参阅 stackoverflow.com/a/19362288/670433 了解使用 ModelName.distinct.count(:attribute_name) 的解决方案
    • 如何返回模型的所有属性?
    【解决方案2】:

    在 Rails 4 中,使用 (...).uniq.count(:user_id) 在其他答案中提到(对于这个问题和 SO 的其他地方)实际上会导致额外的 DISTINCT 出现在查询中:

    SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

    我们实际上要做的是自己使用一个 SQL 字符串:

    (...).count("DISTINCT user_id")

    这给了我们:

    SELECT COUNT(DISTINCT user_id) FROM ...

    【讨论】:

      【解决方案3】:

      应该使用 distinct,在 rails 5.0.1 中,distinct equal uniq,但是

      [11] pry(main)> Needremember.distinct.count(:word)
      (1.1ms)  SELECT DISTINCT COUNT(DISTINCT "needremembers"."word") FROM "needremembers"
      [12] pry(main)> Needremember.uniq.count(:word)
      DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead) (called from __pry__ at (pry):12)
         (0.6ms)  SELECT DISTINCT COUNT(DISTINCT "needremembers"."word") FROM "needremembers"
      

      【讨论】:

        猜你喜欢
        • 2015-01-28
        • 2017-12-19
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 2023-03-15
        • 2012-10-13
        • 1970-01-01
        相关资源
        最近更新 更多