我的SQL数据库中有一张表(订单),想知道哪件商品(商品ID)卖得最多。我当前正在使用以下语句:
SELECT articleID FROM orders
GROUP BY articleID
ORDER BY COUNT(articleID) DESC LIMIT 1;
它可以工作,但是我想知道是否有更好的解决方案。在以前的帖子中找不到类似的内容-如果您这样做,请向我指出正确的方向。
答案 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)