2016-09-09 6 views
1

나는 모든 에 속하는 모든 PollOptions에서 모두 Votes을 포함하는이 SQL 쿼리를 가지고 있습니다. 이 잘 작동하지만 지금은 최신 Polls 반환하는 페이지 매김을 구현하려면. 나는이처럼하려고 노력 :하위 쿼리로 내림차순 정렬?

SELECT offset_polls.id AS pollId, offset_polls.title, poll_options.id AS pollOptionId, text, vote_count 
FROM (
    SELECT * FROM polls ORDER BY id DESC LIMIT 10 OFFSET 0 
) as offset_polls 
JOIN poll_options ON poll_options.poll_id = offset_polls.id 
LEFT OUTER JOIN (
    SELECT poll_option_id, COUNT(poll_option_id) as vote_count 
    FROM votes 
    GROUP BY poll_option_id 
) as votesCount ON poll_options.id = votesCount.poll_option_id 
ORDER BY offset_polls.id desc 

문제는 첫 번째 하위 쿼리 BY ORDER 무시한다는 것입니다 - 예 저는이를 위해 SQL 표준 알고 있습니다. 내가 한 것처럼 행이 반환되지 않습니다. 첫 번째 하위 쿼리에서 ORDER BY을 사용하지 않으면 전체 쿼리가 '의도 됨'으로 작동하지만 Polls은 물론 가장 오래된 쿼리에서 최신 쿼리로 반환됩니다. SQL에서 어떻게 해결할 수 있습니까? 나중에 모든 행을 가져와 페이지 매김을 할 수는 있지만 비효율적 일 것이라고 확신합니다 (Node.js에서 작업). 의도 한대로

편집

위의 쿼리가 작동합니다. 'bug'는 데이터베이스에 파일을 파묻 었습니다.

+0

샘플 데이터 + 예상 된 결과 대 현재 결과를 제공 할 수 있습니까? – sstan

+0

@sstan 이것은 샘플 데이터입니다 : [pastebin] (http://pastebin.com/0VWLeXNg). 앞서 말했듯이, 위 쿼리를 실행하면 0 행을 얻습니다. 10 ('LIMIT 10') 가장 최근의 ('ORDER BY id DESC') 투표 옵션을 반환하는 것을 제외하고는 다음과 같은 것을 돌려 주길 바란다. (http://pastebin.com/rvuFhLFF) 및 집계 된 표. 하지만 'ORDER BY'를 사용하여 첫 번째 하위 쿼리에서 최근 설문 조사 10 개를 필터링하는 것 외에는 그 방법을 알지 못합니다. –

답변

1

샘플 데이터를 검사했는데 postgresql의 동작에 문제가 없습니다. 무슨 일 쿼리를

SELECT * FROM polls ORDER BY id DESC LIMIT 10 OFFSET 0 

를 실행할 때 다음과 같은 id의 모든 여론 조사를 반환한다는 것입니다 : 20, 19, 18, ..., 11. 그런 다음 poll_options으로 해당 행에 가입하고 그 범위의 poll_id와 행이 없기 때문에 당신이 아무것도 얻을 : 당신이 offset_polls 하위 쿼리에서 ORDER BY 절을 제거하면

# SELECT * FROM poll_options WHERE poll_id BETWEEN 11 AND 20; 
id | text | poll_id 
----+------+--------- 
(0 rows) 

, 그것은 10 "랜덤"이 포함됩니다 일부 폴링 옵션이있을 수있는 행으로, 이는 쿼리가 일부 행을 반환하는 이유입니다. 따라서이 경우 ORDER BY은 무시되지 않으며 정확히 예상대로 동작합니다.

+0

예, 감사합니다. 'poll_options'를 시작했을 때 처음 10 개의 투표 (1-10)에 추가했을 뿐이므로 설문 조사 (11-20)를 할 때'JOIN'으로' poll_options'. 쿼리 자체가 의도 한대로 작동합니다. –