2012-02-11 3 views
0

레일 3 애플리케이션을 생성 중입니다.가장 최근 게시물별로 그룹을 정렬하는 SQL 쿼리

그룹이 있습니다 (예 : 회원이있는 사회 집단 및 회원이 그룹에 게시 할 수 있음). 그래서 내 모델은 Group and Post이고, 그룹에는 has_many 개의 게시물이 있습니다 (각각의 (게시물)에는 분명히 group_id가 있습니다).

나는 게시물이없는 그룹을 포함하여 가장 최근 게시물별로 정렬 된 그룹 목록을 얻는 방법을 알아 내려고하고 있습니다.

감사합니다. 레일 3의 최종 해결을 찾고 될 사람을 위해

select g.group_id, g.group_name, max(p.post_date) 
from group g left join post p on g.group_id = p.group_id 
group by g.group_id, g.group_name 
order by max(p.post_date) desc 

답변

1

당신이 가지고있는 컬럼에 따라서는 할 수있는 일, 그것은 다음과 같을 것이다 :

sorted_groups_ids = Group.joins("LEFT JOIN posts p ON groups.id = p.group_id").select("groups.id").group("groups.id").order("MAX(p.id) DESC").map(&:id) sorted_groups = Group.find(sorted_groups_ids).sort_by { |g| sorted_groups_ids.index(g.id) }

두 번째 줄은 다른 찾기가 이전 순서를 깨기 때문에 필요합니다.

+0

고마워요, 나는 그 어떤 것도 성공하지 못한 채 1 시간 이상 동안 알아 내려고 노력했습니다. 그리고 당신의 답은 DESC가 없다는 것을 제외하고는 완벽합니다.) – v0rin

+0

감사합니다. 나중에 이것을 읽는 사람들을 위해서 desc를 추가했습니다. –

+0

레일 3의 최종 해상도를 찾고자하는 사람은 누구나 다음과 같이 보일 것입니다 : 'sorted_groups_ids = Group.joins ("LEFT JOIN posts p ON groups.id = p.group_id") select ("groups.id map (& : id) sorted_groups = Group.find (sorted_groups_ids) .sort_by {| g |)} 그룹 ("그룹 .id"). sorted_groups_ids.index (g.id)}' 다른 찾기가 이전 주문을 깨기 때문에 두 번째 줄이 필요합니다. – v0rin

0
Group.joins('LEFT OUTER JOIN posts ON groups.id = posts.group_id').order('posts.created_at desc').group('groups.id') 
+0

죄송합니다, 작동하지 않습니다. – v0rin

관련 문제