运行这行代码
Activity.uniq.select(:ip).where("created_at > NOW() - INTERVAL 1 DAY").count
返回所有行的数量(没有uniquness过滤器)尽管SQL是正确的(使用DISTINCT关键字)
如果我分两步运行此命令:
c = Activity.uniq.select(:ip).where("created_at > NOW() - INTERVAL 1 DAY")
c.size
然后我得到正确的数字。
怎么可能?
谢谢
答案 0 :(得分:1)
通常DISTINCT
会从结果集中删除重复的结果,但不会进行任何分组。由于COUNT
结果中有一行,因此您不会看到任何效果。你真正想要的是:
SELECT COUNT(DISTINCT activities.ip) FROM activities WHERE ...
请注意,您希望 计算不同的活动,而不是明确的计数。
我不确定你是如何设法使用ActiveRecord发出这个SQL的。您可能需要直接使用ActiveRecord connection
并使用select_value
进行此类异常调查,除非您可以指导select
为您执行此操作。