2012-10-23 2 views
3

다음과 같은 내림차순으로 결과를 반환하는 쿼리가있다.결과 집합의 각 id에 대해`n '행을 얻는다. MYSQL

comment  postid  name  userid tempid 
    ----------------------------------------------------- 
    c1   199  User1  123321 1 
    c2   199  User1  123321 2 
    c3   199  User1  123321 3 
    c4   199  User1  123321 4 
    c5   199  User1  123321 5 
    c6   199  User1  123321 6 
    c7   198  User1  123321 7 
    c8   198  User1  123321 8 
    c9   198  User1  123321 9 
    c10   197  User1  123321 10 
    c11   197  User1  123321 11 
    c12   197  User1  123321 12 
    c13   197  User1  123321 13 
    c14   197  User1  123321 13 
    c15   197  User1  123321 13 
    c16   197  User1  123321 13 

이 지금은 각 postid에 대한 상위 5 개 레코드를 선택하려면 국지적 인이 dersired 결과는

comment  postid  name  userid tempid 
    ----------------------------------------------------- 
    c1   199  User1  123321 1 
    c2   199  User1  123321 2 
    c3   199  User1  123321 3 
    c4   199  User1  123321 4 
    c5   199  User1  123321 5 
    c7   198  User1  123321 7 
    c8   198  User1  123321 8 
    c9   198  User1  123321 9 
    c10   197  User1  123321 10 
    c11   197  User1  123321 11 
    c12   197  User1  123321 12 
    c13   197  User1  123321 13 
    c14   197  User1  123321 13 

가 여기 내 쿼리해야합니다.

DECLARE rangee INT; 
DECLARE uid BIGINT; 

SET @rangee = plimitRange * 10; 
SET @uid = puserid; 

PREPARE STMT FROM 
' 
SELECT comments.comment,comments.postid,user.name,comments.userid,comments.tempid 
FROM 
user 
INNER JOIN comments ON user.userid=comments.userid 
INNER JOIN posts ON posts.postID = comments.postid 
WHERE 
comments.postid <= 
(SELECT MAX(postid) FROM 
(
    SELECT wall.postid FROM wall,posts WHERE 
    wall.postid = posts.postid AND posts.userid=? 
    ORDER BY wall.postid DESC LIMIT 10 OFFSET ? 
)sq1 
) 

AND 
comments.postid >= 
(SELECT MIN(postid) FROM 
(
    SELECT wall.postid FROM wall,posts WHERE 
    wall.postid = posts.postid AND posts.userid=? 
    ORDER BY wall.postid DESC LIMIT 10 OFFSET ? 
)sq2 
) 

AND 
posts.userid = ? 
ORDER BY comments.postid DESC,comments.tempid DESC; 
'; 
EXECUTE STMT USING @uid,@rangee,@uid,@rangee,@uid; 
DEALLOCATE PREPARE STMT; 

어떻게하면됩니까?

+0

난에 제한이있는 하위 쿼리에서 코멘트 테이블을 받고 상상 , 직선 조인이 아니라 작동합니다. 아마도 : http://stackoverflow.com/q/2856397/438971 – Orbling

+0

회신에 대한 thnx하지만 쿼리에서 그것을 지정하여 나를 도울 수 있습니까? – Mj1992

+0

답변에 대한 의견에 링크를 보셨습니까? MySQL의 고급 샘플링은 다소 혼란 스럽습니다. http://explainextended.com/2009/03/06/advanced-row-sampling/ – Orbling

답변

3

모든 레코드 (주석)에 대해 각 그룹 내의 순위 (게시물 별)가 포함 된 테이블을 구체화하려면 부속 조회를 사용해야합니다. 그런 다음, 외부 쿼리에, 당신은 원하는 범위 (최고 5 예 [1,5]) 내에서 순위를 가진 레코드 만 필터링 할 수 있습니다 :

-- select top 5 comments of each of the user's desired posts 
SELECT comments.comment, 
     comments.postid, 
     user.name, 
     comments.userid, 
     comments.tempid 
FROM  user JOIN (
      -- rank comments on user's desired posts by grouping a self-join 
      -- use index (postid, tempid) for performance 
      SELECT  c1.*, COUNT(*) rank 
      FROM  (
         -- select user's posts within desired range 
         SELECT postid 
         FROM (
            -- rank user's posts by grouping a self-join 
            -- use index (userid, postid) for performance 
            SELECT  p1.postid, COUNT(*) rank 
            FROM  posts p1 
            LEFT JOIN posts p2 
              ON p1.userid = p2.userid 
              AND p1.postid < p2.postid 
            WHERE  p1.userid = @uid 
            GROUP BY p1.postid 
           ) ranked_posts 
         WHERE rank BETWEEN @rangee + 1 AND @rangee + 10 
         ) interesting_posts 
        JOIN comments c1 USING (postid) 
      LEFT JOIN comments c2 
        ON c1.postid = c2.postid 
        AND c1.tempid < c2.tempid 
      GROUP BY c1.postid 
     ) comments USING (userid) 
WHERE comments.rank BETWEEN 1 AND 5 
ORDER BY postid DESC, tempid DESC 
+0

'사용자의 원하는 게시물에 대한 순위 의견'이 무엇을 의미하는지 설명 할 수 있습니까? 그리고'c1. *, IFNULL (COUNT (*), 0) rank'는이 부분이''rank'''''''을 무엇을하는지에 대한 것입니다. – Mj1992

+0

당신은 상위 N 개의 코멘트를 선택하기를 원했기 때문에 각 게시물에 대한 코멘트의 순위를 매기고 그 결과를 순위 간격'[1, 5] '내에있는 것으로 제한해야합니다. 그 부분에서'rank'는 앞의 표현식 결과에 대한 별칭 (열 이름)입니다. – eggyal

+0

쿼리를 실행할 때'열 순위는 null이 될 수 없습니다. '라고 설명하고'IFNULL (COUNT (*), 0) '이 무엇을 의미하는지 설명해주십시오. – Mj1992

관련 문제