2012-11-22 2 views
0

이 쿼리의 결과 집합을 제한하는 데 도움이 필요합니다.MySQL 다음 행 ORDER BY 여러 열 JOIN 테이블 2

SELECT tt.id 
FROM kf_topics AS tt 
LEFT JOIN kf_posts AS pp 
ON tt.id = pp.topicid 
WHERE tt.boardid = 1 
GROUP BY tt.id 
ORDER BY tt.sticky DESC, pp.time DESC 

현재 배열은 아래를 반환합니다.

enter image description here

는 그러나, 나는 마음에 ALOT tt.sticky DESC, 보호 프로파일 순서에 따라이 변경됩니다 순서를 베어링, 사용자가 지정한 ID가있는 행 후에 목록에서 행을 찾을 필요가있다. 시간 DESC. 또한 행은 완벽한 ID 순서가 될 수 없기 때문에 ID 필드를 기반으로하는 것이 좋습니다. 내가 ID = 24 이후에 다음 행을 찾기 위해 원하는 경우

그래서 예를 들어, 쿼리 결과는 ID가 =>

답변

0
SET @row:=0; 
SELECT rownum+1 INTO @nextrow FROM 
    (SELECT tt.id AS id, @row AS rownum 
    FROM kf_topics AS tt 
    LEFT JOIN kf_posts AS pp 
    ON tt.id = pp.topicid 
    WHERE tt.boardid = 1 
    AND (@row:[email protected]+1)<=1 
    GROUP BY tt.id 
    ORDER BY tt.sticky DESC, pp.time DESC) A 
WHERE A.id=<id>) 
SET @row=0; 
SELECT A.id FROM 
    (SELECT tt.id AS id, @row AS rownum 
    FROM kf_topics AS tt 
    LEFT JOIN kf_posts AS pp 
    ON tt.id = pp.topicid 
    WHERE tt.boardid = 1 
    AND (@row:[email protected]+1)<=1 
    GROUP BY tt.id 
    ORDER BY tt.sticky DESC, pp.time DESC) A 
WHERE [email protected] 

이 (23)는 단일 쿼리로 재 작성 될 수있을 것이다. 위 쿼리는 최적화되지 않았지만 필요한 결과를 제공합니다. 다시 생각하고 opmized 쿼리를 게시하려고합니다.

+0

도움을 주셔서 감사합니다.하지만 제공 한 쿼리가 정렬되지 않은 목록의 다음 행을 얻고 있다고 생각합니다. 목록이 정렬되지 않았습니까? – sangwe11

+0

네가 맞습니다. 내가 이걸 수정하게 해줘. –

3

우리는 단일 쿼리를 사용하여

SELECT ttid 
FROM 
(SELECT tt.id ttid,@row:[email protected]+1 rownum,IF(tt.id=24,@j:[email protected],0) 
FROM kf_topics AS tt 
LEFT JOIN kf_posts AS pp 
ON tt.id = pp.topicid JOIN (SELECT @row:=0) AS rowcount 
WHERE tt.boardid = 1 
GROUP BY tt.id 
ORDER BY tt.sticky DESC, pp.time DESC) A JOIN (SELECT @j+1 as rownum) B ON (A.rownum=B.rownum); 

난 당신이에 의해 그룹을 사용하는 이유는 확실하지 않다 다음과 같은 것을 할 수 있지만, 어떤 경우에 작동합니다.