2011-08-20 2 views
51

이 쿼리"그룹 기준"결과의 "순서"?

Message.where("message_type = ?", "incoming").group("sender_number").count 

은 나에게 해시를 반환합니다.

OrderedHash {"1234"=>21, "2345"=>11, "3456"=>63, "4568"=>100} 

이제 각 그룹의 수로 주문하고 싶습니다. 어떻게 쿼리 내에서 그렇게 할 수 있습니다.

답변

82

가장 쉬운 방법은 원래 쿼리에 순서 절을 추가하는 것입니다. 나는이 시도 할 때

Message.where('message_type = ?','incoming') 
     .group('sender_number') 
     .order('count_id asc').count('id') 
+1

아니요. 나를 위해 작동하지 않습니다. –

+1

어떤 데이터베이스 엔진을 사용하고 있습니까? 어떤 버전의 레일, 그리고 생성 된 SQL은 무엇입니까? 레일즈 3.0.7에서 잘 작동하는 테스트 케이스 (다른 모델)가 있습니다. (가격은 "null"이 아닌) .test = Price.where (가격은 null이 아님). group (: price_date) .order ('count_price asc'). count ('price')','SELECT COUNT ("prices". "price ") AS count_price, price_date AS price_date FRAME"prices "WHERE (가격이 널이 아님) GROUP BY price_date ORDER BY count_price asc' –

+0

고맙습니다. 이로 인해 이전에 내가했던 일과 비교할 때 질의로부터 너무 많은 시간을 절약 할 수있었습니다! 가장 중요한 교훈 : count 메소드가 'count_ {column}'이라는 이름의 출력 열을 생성한다는 것을 알게되었습니다! 고맙습니다! – Yavin4

13

: 당신이 계산 방법을 특정 필드를 줄 경우, 주문 전화를 추가하여 생성 된 SQL에서 사용할 수있는 이름 count_ {열},과 출력 열을 생성합니다 레일은 SELECT가 ... AS count_all

그래서 나는 다음과 같이 시몬의 대답 @에서 쿼리를 업데이트 말한다

SQLite3::SQLException: no such column: count_id: SELECT COUNT(*) AS count_all, state AS state FROM "ideas" GROUP BY state ORDER BY count_id desc LIMIT 3 

주의 날이 오류를 준 그리고 그것은 나를

작동
+0

어떤 AR 버전에서' count_id' 대신'count_all'을 사용하지만 4.2.1에서는'.order ("count_id desc")'가 작동합니다. – sameers

+0

저에게 맞습니다. 어쩌면 당신은 .count ('id')를 놓쳤을까요? – mahemoff