본문 바로가기
MySql

MySQL 레일 COUNT SELECT DISTINCT

by 베이스 공부 2021. 1. 10.
반응형

사용자가 일련의 동영상을 본 횟수를 기록하고 있습니다. 이제 매일 비디오를 시청하는 사용자 수의 그래프를 만들려고합니다.

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 >]

해시보다는.

어떤 아이디어?

레일 3.1과 mysql을 사용하고 있습니다.

 

해결 방법

 

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을 생성 할 것이라고 생각합니다.

 

참조 페이지 https://stackoverflow.com/questions/15110166

 

 

반응형

댓글