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