MySQL:如何获得每个分组的 x 个结果 [重复]

Posted

技术标签:

【中文标题】MySQL:如何获得每个分组的 x 个结果 [重复]【英文标题】:MySQL: how to get x number of results per grouping [duplicate] 【发布时间】:2012-11-01 19:36:12 【问题描述】:

可能重复:mysql: Using LIMIT within GROUP BY to get N results per group?

我有两张桌子:

    项目 类别

每个项目都属于一个类别。我想要做的是每个类别选择 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(数值)排序

【问题讨论】:

当一个类别的商品超过5个时,应该使用什么规则来确定哪个应该返回5个? @Dems,好问题:如果每个类别有超过 5 个项目 - 它们应该按 item_id(数值)排序并选择前 5 个 我认为这就是您想要实现的目标。 [***.com/questions/2129693/…[1]:***.com/questions/2129693/… 关于每组最大 n 的一千多个问题之一。 ***.com/search?q=greatest+n+per+group 【参考方案1】:
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 的解决方案,实际上它非常出色。 :)

【讨论】:

【参考方案2】:

试试这个查询 -

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 表。

【讨论】:

重新发明了***,但不是很好,请在此处查看优雅的六线:xaprb.com/blog/2006/12/07/… @Tomas 共享链接的页面讨论如何选择每个组的顶部“x”。但是,该页面上有一个链接,其中讨论了从每个组中选择“x”号。 xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql 它对我有用,但不明白如何。你能解释一下吗?

以上是关于MySQL:如何获得每个分组的 x 个结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 的组中获得第三个 [重复]

SQL如何先用group by分组,并将分组的结果distinct?

如何使用MySQL查询某个列中相同值的数量统计

MySQL分组[重复]

慢查询分组,加入MYSQL laravel

如何将mysql内部连接结果从行分组到列