2010-05-25 2 views
4

나는 통계적 목적으로 사용되는 쿼리가 있습니다. 그것은 주어진 횟수만큼 로그인 한 사용자의 수를 나눕니다. 사용자 has_many 설치 및 설치 login_count 있습니다.레일스 쿼리 언어를 사용하는 복잡한 쿼리

select total_login as 'logins', count(*) as `users` 
    from (select u.user_id, sum(login_count) as total_login 
      from user u 
       inner join installation i on u.user_id = i.user_id 
       group by u.user_id) g 
    group by total_login; 

+--------+-------+ 
| logins | users | 
+--------+-------+ 
| 2  |  3 | 
| 6  |  7 | 
| 10  |  2 | 
| 19  |  1 | 
+--------+-------+ 

동일한 정보를 얻기 위해 우아한 ActiveRecord 스타일 find이 있습니까? 이상적으로 로그인 사용자의 해시 컬렉션으로 : 내가 직접 SQL을 사용할 수 있습니다 알고 있지만 이것은 레일에 해결 될 수있는 방법을 알고 싶어 { 2=>3, 6=>7, ...

3.

답변

6
# Our relation variables(RelVars) 
U =Table(:user, :as => 'U') 
I =Table(:installation, :as => 'I') 

# perform operations on relations 
G =U.join(I) #(implicit) will reference final joined relationship 

#(explicit) predicate = Arel::Predicates::Equality.new U[:user_id], I[:user_id] 
G =U.join(I).on(U[:user_id].eq(I[:user_id]) 

# Keep in mind you MUST PROJECT for this to make sense 
G.project(U[:user_id], I[:login_count].sum.as('total_login')) 

# Now you can group 
G=G.group(U[:user_id]) 

#from this group you can project and group again (or group and project) 
# for the final relation 
TL=G.project(G[:total_login].as('logins') G[:id].count.as('users')).group(G[:total_login]) 

"여기에 코드가 있습니다"뿐만 아니라 작업 순서를 표시하고 싶었 기 때문에 매우 자세한 정보입니다. 코드는 실제로 코드의 절반으로 작성 될 수 있습니다.

털이 부분은 원칙적으로 카운트 () 이다,하여 그룹에 나타납니다 집계에 사용되지 않는 SELECT의 모든 속성이 너무 수 ()

조심 왜 당신에게 것 total_login 횟수로 그룹화 하시겠습니까? 하루가 끝날 때 사용자 정보가 외부의 가장 많은 수의 그룹화와 관련이 없으므로 모든 설치의 총 로그인 수를 계산하지 않는지 묻습니다.

+0

고맙습니다. 진정한 문제는 어떻게 이런 일을 할 수 있었는지였습니다. 궁극적으로, 나는 누군가를 찾아서 이름을 짓는 것 이상의 흥미로운 사건들을 처리하려고하고있다. –

2
난 당신 같은 아무것도 찾을 수 있습니다 생각하지 않는다

db를 갖는 것이 효율적입니다. DB에서 행을 검색하지 않으려는 경우, 데이터 자체를 그룹화하여 응답을 계산하기를 원한다는 것을 기억하십시오.

SQL을 데이터베이스에 추가로 밀어 넣으려면 데이터베이스에 뷰로 쿼리를 만든 다음 Rails ActiveRecord 클래스를 사용하여 결과를 검색 할 수 있습니다.

+0

저는 db 뷰로의 AR 매핑에 대해 여기서 배웠습니다. 유용한, 감사합니다 :) – tsdbrown

+0

그건 재미있는 생각이야. 좀 더 살펴볼 것입니다. –

0

결국 SQL 구문이 더 읽기 쉽습니다. 이 애들 한테는 단지 약간의 복잡성 만 더 필요로 할 때마다 늘 저를 늦추고 있습니다. 그것은 당신이 배우는 또 다른 문법이며, 가치가 없습니다. 나는이 경우에 SQL을 고집 할 것이다.

+0

학습 곡선이 길기 때문에 학습 가치가 없다는 의미는 아닙니다. arel이 종료 된 이후로 필자는 이제까지 SQL을 작성한 적이 없으며 매우 만족 스럽습니다. –