开发者

MySQL limit results per category

开发者 https://www.devze.com 2022-12-15 15:35 出处:网络
Each item in c_data is in a category/section. I would like to limit how many items are displayed per category, rather than limiting the total number of items retrieved. Obviously if I add something li

Each item in c_data is in a category/section. I would like to limit how many items are displayed per category, rather than limiting the total number of items retrieved. Obviously if I add something like "limit 20" to the query, it will only fetch 20 results in total, rather than 20 results per category.

   SELECT cm.id,
                cm.title AS cmtitle,
                cm.开发者_如何学JAVAsectionid,
                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

The field with the category is "sectionid".


MySQL doesn't have any ranking functionality, but you can use a variable to create a psuedo row number.

Use:

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


The answers to this previous post should help you to solve that problem.

EDIT:

It should work with using row numbers.

I have not tried it, but this should work:

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

精彩评论

暂无评论...
验证码 换一张
取 消