我有一张包含类别,产品和数量的表格。所有整数。 我正在寻找最有效的查询,它将为我提供每个类别的前十大产品(最高计数)。
我已经尝试了几个子选择和连接,但无法弄清楚如何在单个查询中执行此操作。谢谢你的帮助。
答案 0 :(得分:7)
select a.* from t a where 10 > (
select count(*) from t b
where b.category=a.category
and b.count<a.count
)
我认为这就是你所需要的。
答案 1 :(得分:4)
在我的博客中对本文稍作修改的查询:
SELECT l.*
FROM (
SELECT category,
COALESCE(
(
SELECT count
FROM mytable li
WHERE li.category = dlo.category
ORDER BY
li.category DESC, li.count DESC, li.id DESC
LIMIT 9, 1
), CAST(-1 AS DECIMAL)) AS mcount
COALESCE(
(
SELECT id
FROM mytable li
WHERE li.category = dlo.category
ORDER BY
li.category DESC, li.count DESC, li.id DESC
LIMIT 9, 1
), CAST(-1 AS DECIMAL)) AS mid
FROM (
SELECT DISTINCT category
FROM mytable dl
) dlo
) lo, mytable l
WHERE l.category >= lo.category
AND l.category <= lo.category
AND (l.count, l.id) >= (lo.mcout, lo.id)
您需要在(category, count, id)
上创建一个复合索引,以便高效工作。
请注意使用l.category >= lo.category AND l.category <= lo.category
而不仅仅是l.category = lo.category
这是让MySQL
使用高效Range check for each record
答案 2 :(得分:2)
This article解决了您的问题。
基本上,它说如果你的桌子很小,你可以做一个自我不平等的加入,如下:
SELECT t1.*, COUNT(*) AS countRank
FROM tbl AS t1
JOIN tbl AS t2 ON t1.category=t2.category AND t1.count <= t2.count
GROUP BY t1.category, t1.count
HAVING countRank <= 10
ORDER BY category,count DESC;
这是一项昂贵的操作,但对于小桌子你应该没问题。如果你有一个大表,你应该忘记用一个查询来实现它并实现一个不同的解决方案。
答案 3 :(得分:1)
SET @row = 0;
SET @category = 0;
SELECT top.*
FROM (
SELECT IF(@category = p.cId, @row := @row + 1, @row := 1) rowNumber,
(@category := p.cId) categoryId,
p.pId
FROM (
SELECT c.cId,
c.pId
FROM prod pr
INNER JOIN cat_prod c ON c.pId = pr.id
GROUP BY c.cId, c.pId
) p
) top
HAVING top.rowNumber < 4;
答案 4 :(得分:0)
select a.* from `table` a where a.product in (
select b.product from `table` b
where b.category=a.category
order by b.count desc
limit 10
)
我认为这是一个好方法,但mysql会返回:
MySQL 返回:文档
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'