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 个结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章