【问题标题】:Get most sold products with a specified one获取指定产品销量最多的产品
【发布时间】:2016-10-16 20:53:08
【问题描述】:

我有一个包含这些信息的表 order_detail

id_order  id_product
1         2
1         3
2         2
2         4
2         5
2         3
3         2
3         1
4         2 
4         3
4         1
4         6

我想用当前产品获得最畅销的产品(前 5 个元素),比如说产品 id 2

我试过了,但它返回一个错误的结果

SELECT od2.product_id, count(od2.`product_id`) FROM `ps_order_detail` od1  
LEFT JOIN ps_order_detail od2 ON od1.id_order = od2.id_order where
od2.product_id != od1.product_id AND od1.product_id=2

结果应该是

product_id    count(od2.`product_id`)
3             3
4             2
1             1
5             1 
6             1

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您的查询在正确的轨道上。大多数情况下,您缺少group by:

    select od.product_id, count(od2.id_order) as NumTimesWith2
    from ps_order_detail od left join
         ps_order_detail od2
         on od.id_order = od2.id_order and
            od2.product_id = 2 
    where od.product_id <> 2
    group by od.product_id
    order by count(od2.id_order) desc;
    

    如果您只想要一个这样的产品,请在查询中添加limit 1。

    此外,这假设产品不会在订单内重复。如果可以,您可以使用count(distinct od.id_order) 快​​速获得更好的计数。

    【讨论】:

    • Thnks 非常快,但为什么我在结果中得到产品 id 2?
    • @tarekfellah 。 . .我最初将查询编写为内部联接,并具有od2.id_product &lt;&gt; od.id_product。使用内部连接,这将是一个过滤器。但是,left join 会执行其他操作(将列设置为 NULL 而不是过滤)。我确定了答案。
    • 为什么你按 count(*) 排序它返回未排序的结果,我用 count(od2.id_order) 排序,它似乎工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多