首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql Join with limit?

Mysql Join with limit?
EN

Stack Overflow用户
提问于 2009-06-25 06:54:28
回答 5查看 10.6K关注 0票数 4

我有一个表,里面有类别、产品和数量。所有整数。我正在寻找最有效的查询,它将给我每个类别的前10个产品(最高计数)。

我尝试了几个子选择和连接,但不知道如何在一个查询中完成。谢谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-26 08:17:19

代码语言:javascript
复制
select a.* from t a where 10 >  (
   select count(*) from t b 
   where b.category=a.category 
   and b.count<a.count
) 

我想这就是你需要的。

票数 7
EN

Stack Overflow用户

发布于 2009-06-26 12:26:35

我的博客中的这篇文章中的一个略微修改的查询:

代码语言:javascript
复制
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的技巧

票数 4
EN

Stack Overflow用户

发布于 2009-06-25 08:09:58

我认为This article解决了你的问题。

基本上,它的意思是,如果你的表很小,你可以做一个自我不平等连接,就像这样:

代码语言:javascript
复制
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;

这是一个昂贵的操作,但对于一张小桌子来说,你应该没问题。如果你有一个很大的表,你应该忘记用一个查询来做这件事,而是实现一种不同的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1042481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档