2010-01-04 127 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 

該分類的字段是「sectionid」。

+0

被列入它。 c_main表包含5個類別,而c_data表包含與這些類別對應的信息。大多數類別的數據(在c_data中)有5-10個項目,其中一個目前有80個項目。 – user242632 2010-01-04 19:11:14

+0

@nsan:需要該數據 – 2010-01-04 19:25:56

+0

http://pastebin.ca/1737829 – user242632 2010-01-04 20:24:38

回答

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沒有排序,你的解決方案是否會工作? – 2010-01-04 17:39:05

+0

即使在END AS排名後添加了逗號,也會給出語法錯誤。 – user242632 2010-01-04 17:45:31

+0

缺少兩個逗號 - 'cd.sectionid AS sectionid,',以及'AS rank'後 – 2010-01-04 18:14:12

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行,而不是幾天。旁觀者的回答指向使用rownumbers。儘管如此,我會提供更好的答案,除非你打敗我;-) – 2010-01-04 17:13:08

+0

@OMG小馬:謝謝,我糾正了這一點。 – 2010-01-04 18:31:00

+0

+1:這畢竟是你的算法,我只是在實現它的時候更快。 – 2010-01-04 18:40:42