Oracle-按最频繁的条目分组

Oracle-按最频繁的条目分组,oracle,Oracle,我的Oracle数据库上有两个表 有产品清单的人 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 -

我的Oracle数据库上有两个表

有产品清单的人

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_列表表,但按orders表中最常见的product_id排序。因此,在这种情况下,产品ID=2必须位于列表的第一位


我找到了一些示例,但我找不到适用于这种情况的方法。

您可以在orders表上使用subquery for aggregation来查找每个产品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;

您可以使用orders表上聚合的子查询来查找每个产品id的计数,然后将其与product_列表表左键联接,以使用计算出的计数进行排序

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;
  • 之所以使用左联接,是因为并非所有产品都有订单,我们需要找到每个产品的订单数量
  • 之所以使用GROUP BY,是因为我们使用aggregate count()来查找给定产品订单的出现情况
  • 使用ORDER BY DESC,以便将计数从产品订单的最高计数先到最低进行排序。但是,当存在联系时,我们不知道将返回什么订单,因为未定义订单的第二级。可能是订单,我们可以添加一个产品ID,以便在之后从低到高

  • 之所以使用左联接,是因为并非所有产品都有订单,我们需要找到每个产品的订单数量
  • 之所以使用GROUP BY,是因为我们使用aggregate count()来查找给定产品订单的出现情况
  • 使用ORDER BY DESC,以便将计数从产品订单的最高计数先到最低进行排序。但是,当存在联系时,我们不知道将返回什么订单,因为未定义订单的第二级。可能是订单,我们可以添加一个产品ID,以便在之后从低到高

您是否同时使用MySQL和Oracle?如果没有,请删除其中一个标签。(是的,MySQL归Oracle所有,但仅使用[MySQL]即可。)您是否同时使用MySQL和Oracle?如果没有,请删除其中一个标签。(是的,MySQL归Oracle所有,但仅使用[MySQL]即可。)