表中ID的最大数量

时间:2019-02-03 22:16:29

标签: sql

我的SQL数据库中有一张表(订单),想知道哪件商品(商品ID)卖得最多。我当前正在使用以下语句:

SELECT articleID FROM orders 
GROUP BY articleID 
ORDER BY COUNT(articleID) DESC LIMIT 1;

它可以工作,但是我想知道是否有更好的解决方案。在以前的帖子中找不到类似的内容-如果您这样做,请向我指出正确的方向。

2 个答案:

答案 0 :(得分:2)

只要对articleid进行了索引,它大概是一个外键,因此应该已经存在,您的查询就可以了。 explain analyze显示正在发生的事情。您没有提到正在使用哪个数据库,所以这就是Postgres。

test=> select count(*) from orders;
  count  
---------
3003116

test=> select count(distinct articleid) from orders;
  count  
---------
 1999922

test=> explain analyze SELECT articleID FROM orders 
GROUP BY articleID 
ORDER BY COUNT(articleID) DESC LIMIT 1;
                                                                            QUERY PLAN                                                                             
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=149534.48..149534.48 rows=1 width=12) (actual time=1446.766..1446.767 rows=1 loops=1)
   ->  Sort  (cost=149534.48..156236.51 rows=2680814 width=12) (actual time=1446.765..1446.765 rows=1 loops=1)
         Sort Key: (count(articleid)) DESC
         Sort Method: top-N heapsort  Memory: 25kB
         ->  GroupAggregate  (cost=0.43..136130.41 rows=2680814 width=12) (actual time=3.772..1245.538 rows=1999922 loops=1)
               Group Key: articleid
               ->  Index Only Scan using orders_article_id on orders  (cost=0.43..94306.81 rows=3003092 width=4) (actual time=1.307..648.542 rows=3003116 loops=1)
                     Heap Fetches: 3003116
 Planning time: 4.692 ms
 Execution time: 1446.809 ms

大部分成本是扫描索引并汇总结果。 order by非常便宜。

成本随着订单数量的增加而线性增加。订单翻倍,成本翻倍。如果不能接受,您可以改为制作一个单独的订单统计表,并定期或使用触发器对其进行更新。

答案 1 :(得分:-1)

您可以尝试执行此操作,我摆脱了ORDER BY,操作速度很慢。

WITH T AS(
SELECT COUNT(*) AS C1, articleID FROM orders
GROUP BY articleID)
SELECT articleID FROM T
WHERE C1 = (SELECT MAX(C1) FROM T)