首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排序、分组和过滤SQL结果集

排序、分组和过滤SQL结果集
EN

Stack Overflow用户
提问于 2010-12-10 23:41:44
回答 3查看 117关注 0票数 0

我在数据库中有许多“容器”,每个容器包含零个或多个项。每个项都有一个名称、分数、表示它被添加到容器的时间戳,以及容器ID上的外键。

我想获取顶部条目得分为5或更高的所有容器(这意味着不返回空容器)。由于容器在此实例中的行为类似于堆栈,因此具有最高“添加时间”的项被认为是“顶部”项。

目前,我使用的SQL如下:

代码语言:javascript
运行
复制
SELECT * FROM (
  SELECT name, container_id, score
  FROM items
  ORDER BY added_time DESC
) AS temptbl
GROUP BY container_id
HAVING score >= 5

这似乎给了我想要的结果,但当项目数量开始增加时,它会非常慢-在MySQL控制台上对8000个容器和10000个项目运行查询需要近6秒,这太慢了。我是不是在做一些明显低效的事情?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-07 18:53:28

事实证明,内部select有一个左连接,这导致了减慢-删除,从而将查询时间减少到0.01s。这意味着丢失连接带来的信息,但这可以在以后填充(最终返回的行数很小,所以如果我必须为每个行运行查询来复制左连接的效果,这并不重要)。

票数 0
EN

Stack Overflow用户

发布于 2010-12-10 23:57:28

也许这就是你想要的:

代码语言:javascript
运行
复制
SELECT name, container_id, score
FROM items AS tb1
RIGHT JOIN (SELECT container_id, Max(added_time) as added_time 
    FROM items GROUP BY tablename) as tb2 on 
    tb1.container_id = tb2.container_id AND tb1.added_time = tb2.added_time
WHERE score >= 5
票数 0
EN

Stack Overflow用户

发布于 2010-12-11 03:13:52

尝试以下任一操作。它依赖于(container_id,added_id)的唯一性。

代码语言:javascript
运行
复制
select *
  from (select container_id, max(added_time) as added_time
          from items
         group by container_id
       ) as topitems 
  join items on(topitems.container_id = items.container_id and 
                topitems.added_time   = items.added_time)
 where items.score >= 5;


select *
  from items a
 where score >= 5
   and (added_time) = (select max(b.added_time)
                         from items b
                        where a.container_id = b.container_id);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4410496

复制
相关文章

相似问题

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