7

可能重复:
mysql:在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

我有两张桌子:

  1. 项目
  2. 类别

每个项目都属于一个类别。我想要做的是每个类别选择 5 个项目,但总共选择 20 个项目。

SELECT 

   item_id, item_name, items.catid 

FROM

   items, categories

WHERE

   items.catid = categories.catid

GROUP BY items.catid LIMIT 0,5 //5 per category group

编辑:如果每个类别有超过 5 个项目 - 它们应该按 item_id (数值)排序

4

2 回答 2

5

试试这个查询 -

SELECT item_id, item_name, catid FROM 
  (SELECT t1.*, COUNT(*) cnt FROM items t1
    LEFT JOIN items t2
      ON t2.catid = t1.catid AND t2.item_id <= t1.item_id 
  GROUP BY
    t1.catid, t1.item_id
  ) t
WHERE
  cnt < 6
-- LIMIT 20

它将显示每个类别的前 5 个项目。LIMIT 20如果需要,请取消注释。Categories如果需要,请加入表。

于 2012-11-13T11:24:12.197 回答
0
SELECT item_id, item_name, catid
FROM (  SELECT item_id, item_name, catid,
            CASE WHEN @catid != catid THEN (@rownum := 1) + !(@catid := catid) ELSE @rownum := $rownum + 1 AS rownum
        FROM (  SELECT item_id, item_name, i.catid
                FROM items AS i
                INNER JOIN categories AS c
                ON i.catid = c.catid
                ORDER BY i.catid ASC) AS h, (SELECT @catid := NULL, @rownum := NULL) AS var
                HAVING rownum <= 5
                LIMIT 20) AS h2
ORDER BY item_id

Devart 的解决方案看起来是正确的,但我对它的完全理解有点小题大做。我的可能对其他人没有多大意义,但对我来说确实如此。

编辑:现在了解 Devart 的解决方案,实际上它非常出色。:)

于 2012-11-13T12:07:33.087 回答