我有一个表,里面有类别、产品和数量。所有整数。我正在寻找最有效的查询,它将给我每个类别的前10个产品(最高计数)。
我尝试了几个子选择和连接,但不知道如何在一个查询中完成。谢谢你的帮助。
发布于 2009-06-26 08:17:19
select a.* from t a where 10 > (
select count(*) from t b
where b.category=a.category
and b.count<a.count
) 我想这就是你需要的。
发布于 2009-06-26 12:26:35
我的博客中的这篇文章中的一个略微修改的查询:
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的技巧
发布于 2009-06-25 08:09:58
我认为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;这是一个昂贵的操作,但对于一张小桌子来说,你应该没问题。如果你有一个很大的表,你应该忘记用一个查询来做这件事,而是实现一种不同的解决方案。
https://stackoverflow.com/questions/1042481
复制相似问题