Oracle - 由最频繁的条目组

时间:2017-03-28 18:20:32

标签: oracle

我的Oracle DB上有2个表

一个有产品清单

PRODUCT_ID - PRODUCT_NAME - PRODUCT_PRICE
     1            P_1            50
     2            P_2            60
     3            P_3            70
     4            P_4            80

一个订单

   CLIENT_ID - PRODUCT_ID   -  ORDER_PRICE
         1            1          50
         2            3          60
         3            2          70
         4            2          70

我需要进行查询,以便返回product_list表,但按订单表中最常用的Product_id排序。因此,在这种情况下,产品ID = 2必须首先在列表中。

我找到了一些例子,但我找不到适合这种情况的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用子查询在订单表上进行汇总,以查找每个产品ID的计数,然后将其与product_list表连接起来,以使用计算的排序计数。

select p.*
from product_list p
left join (
    select product_id,
        count(*) as cnt
    from orders
    group by product_id
    ) o on p.product_id = o.product_id
order by o.cnt desc nulls last;

答案 1 :(得分:1)

  • 使用LEFT Join,因为并非所有产品都有订单,我们需要查找每种产品的订单数量。
  • 使用GROUP BY是因为我们使用聚合count()来查找给定产品的订单发生。
  • 使用ORDER BY DESC,因此计数从最高到最低的产品订单的最高数量。但是,当存在关系时,我们不知道将返回什么订单,因为未定义第二级订单。可以订购我们可以添加一个Product_ID,以便它们在那之后从低到高......

SELECT PL.Product_ID, PL.Product_Name, PL.Product_Price, count(O.Product_ID) cnt  
FROM Product_List 
LEFT JOIN Orders O 
  on O.Product_ID = PL.Product_ID 
GROUP BY PL.Product_ID, PL.Product_Name, PL.Product_Price 
ORDER BY cnt Desc