2010-01-04 3 views
4

c_data의 각 항목은 카테고리/섹션에 있습니다. 검색된 항목의 총 개수를 제한하는 대신 카테고리 당 표시되는 항목 수를 제한하고 싶습니다. 분명히 "제한 20"과 같은 것을 쿼리에 추가하면 카테고리 당 20 개의 결과가 아닌 총 20 개의 결과 만 가져옵니다.카테고리 당 MySQL 제한 결과

SELECT cm.id, 
       cm.title AS cmtitle, 
       cm.sectionid, 
       cm.type AS cmtype, 
       cd.id, 
       cd.time, 
       cd.link, 
       cd.title, 
       cd.description, 
       cd.sectionid AS sectionid 
     FROM c_main AS cm 
     JOIN c_data AS cd ON cd.sectionid=cm.sectionid 
    WHERE cd.sectionid=cm.sectionid 
    ORDER by id ASC 

카테고리가있는 필드는 "섹션 ID"입니다.

+0

. c_main 테이블에는 5 개의 범주가 있고 c_data 테이블에는 해당 범주에 해당하는 정보가 들어 있습니다. 대부분의 카테고리 데이터 (c_data에서)는 5-10 개의 항목을 가지고 있으며, 하나는 현재 80 개가 넘는 항목을 가지고 있습니다. – user242632

+0

@nsan : 데이터가 필요합니다. –

+0

http://pastebin.ca/1737829 – user242632

답변

4

MySQL은 어떤 순위 기능이없는,하지만 당신은 사이비 행 번호를 생성하기 위해 변수를 사용할 수 있습니다.

사용 : 그것은 포함되고

SELECT x.* 
    FROM (SELECT cm.id, 
       cm.title AS cmtitle, 
       cm.sectionid, 
       cm.type AS cmtype, 
       cd.id AS cd_id, 
       cd.time, 
       cd.link, 
       cd.title, 
       cd.description, 
       cd.sectionid AS cd_sectionid, 
       CASE 
       WHEN @sectionid != cm.sectionid THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @sectionid := cm.sectionid 
      FROM C_MAIN cm, 
       C_DATA cd, 
       (SELECT @rownum := 0, @sectionid := NULL) r 
     WHERE cm.sectionid = cd.sectionid 
     ORDER BY cm.sectionid) x 
WHERE x.rank <= 20 
ORDER BY id 
+0

'END AS rank'다음에','가 누락 된 것 같아요. sectionid가 정렬되지 않은 경우 해결책이 효과가 있습니까? –

+0

END AS 순위 뒤에 쉼표를 추가 한 후에도 구문 오류가 발생합니다. – user242632

+0

'cd.sectionid AS sectionid,','AS rank' 뒤의 두 개의 쉼표가 누락되었습니다. –

4

previous post에 대한 대답은이 문제를 해결하는 데 도움이됩니다.

편집 :

그것은 row numbers를 사용하여 작동합니다.

나는 그것을 시도하지 않은,하지만이 작동합니다 :

set @section = ''; 
set @num = 1; 

SELECT y.* 
FROM 
(
    SELECT 
     x.*, 
     @num := if(@section = sectionid, @num + 1, 1) as row_number, 
     @section := sectionid 
    FROM 
    (
     SELECT 
      cm.id AS cm_id, 
      cm.title AS cmtitle, 
      cm.sectionid, 
      cm.type AS cmtype, 
      cd.id AS cd_id, 
      cd.time, 
      cd.link, 
      cd.title, 
      cd.description 
     FROM c_main AS cm 
     JOIN c_data AS cd ON (cd.sectionid=cm.sectionid) 
     ORDER by cd.sectionid ASC, cm.id ASC 
    ) x 
) y 
WHERE y.row_number <= 20; 
+0

질문의 초기 의도는 일이 아닌 마지막 15 개의 행을 취하는 것이 었습니다. astander의 대답은 rownumbers를 사용하는 것을 가리 킵니다. 나는 당신이 나를 때리지 않는 한 더 나은 대답을 제공 할 것입니다 ;-) –

+0

@OMG Ponies : 고마워요. –

+0

+1 : 어쨌든 당신의 알고리즘이었습니다. 구현하기가 더 빨랐습니다. –