2011-05-05 4 views
1

이러한 쿼리를 하나의 쿼리로 압축 할 수있는 방법이 있습니까? author_id, status, category_idsite_id :Rails에서 속성 조합 쿼리 - 9 개의 쿼리를 1로 만드는 방법은 무엇입니까?

나는 4 개 속성에 대한 1 개 테이블을 쿼리하고있다. 목표는 각 사례별로 가장 최근의 레코드를 찾고 싶습니다 (이유는보고를 위해 카운터를 늘리는 것입니다).

# author_id 
SELECT * FROM posts WHERE posts.author_id = 10 ORDER BY created_at desc LIMIT 1 

# author_id + status 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' ORDER BY created_at desc LIMIT 1 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' ORDER BY created_at desc LIMIT 1 

# author_id + site_id 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1 

# author_id + status + site_id 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1 

# author_id + site_id + category_id 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1 

# author_id + status + site_id + category_id 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1 
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1 

9 개의 쿼리입니다. 나는 레일에서 이것을하고 있기 때문에, 목표는 하나의 Post.all(:conditions => x) 호출에서 9 Post 모델을 가지고있을 것이고, 나는 루비 코드에서 그것들을 걸러 낼 수있다. 이것이 가능한가? 가장 좋은 방법은 무엇입니까? 는 SQL 측에서

https://gist.github.com/965233

+1

이 모든 SQL 호출을 생성하는 루비를 게시 할 수 있습니까? – jaredonline

+0

하나의 SQL 문에서 필요로하는 이유가 있습니까? 나는 결과 SQL이 추리가 될 것이라고 확신한다. –

+0

은 [이 요지] (https://gist.github.com/965233)에 대한 링크로 업데이트되어 그 db 호출을 생성하는 루비 코드를 보여준다. –

답변

1

당신이 일치하는 목록이 쿼리를 결합하는 UNION을 사용할 수 있습니다

업데이트 여기

대략 나는 이러한 쿼리를 생성하는 데 사용하고 코드입니다 필드의. 필드를 추가하여 정렬하고 다른 쿼리로 모두 감싸서 정렬하십시오. 그런 다음 결과 세트를 반복 할 수 있습니다.

SELECT * FROM 
( 
    SELECT 1 QNO, * FROM SOMETABLE WHERE A=1 
    UNION ALL 
    SELECT 2 QNO, * FROM SOMETABLE WHERE A=1 AND B=2 
    UNION ALL 
    SELECT 3 QNO, * FROM SOMETABLE WHERE A=2 AND B=4 AND C=11 
) 
ORDER BY QNO; 
관련 문제