首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL Get产品也是通过产品/优化查询购买的

MySQL Get产品也是通过产品/优化查询购买的
EN

Stack Overflow用户
提问于 2016-08-19 09:29:24
回答 2查看 631关注 0票数 1

我想写一个简单的“顾客也买了.”

我有一个包含订单的order表和一个包含与订单相关的所有产品的order_product表。

为了找出用product_id = 155购买的五种最受欢迎的产品,我编写了以下查询:

代码语言:javascript
复制
select product_id, count(*) as cnt 
from order_product 
where product_id != 155 
and order_id in 
(select order_id from order_product where product_id = 155) 
group by product_id 
order by cnt desc 
limit 5;

因此,内部查询将获得我感兴趣的产品的所有订单列表(product_id = 155),然后外部查询将查找所有不是相同产品但与我的产品顺序相同的产品。

然后,他们被命令,并限制在前5名。

我认为这是可行的,但它需要很长时间-我想这是因为我用的是一个有几千个列表的IN。

我想知道是否有人能以一种更优化的方式指出我写它的方向。

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 10:08:19

您可以尝试改变这种情况:

代码语言:javascript
复制
select p1.product_id, p1.count(*) as cnt

代码语言:javascript
复制
select p1.product_id, count(distinct p1.order_id) as cnt 

看看这会不会给你带来不同的结果

编辑:来自评论

如果您希望在第一个查询中获得所生成的结果,可以使用以下方法:

代码语言:javascript
复制
select a.product_id, count(*) as cnt 
from order_product a
join (select distinct order_id from order_product where product_id = 155) b on (a.order_id = b.order_id)
where a.product_id != 155 
group by a.product_id 
order by cnt desc 
limit 5;

对现有查询的一个小改动:)

票数 3
EN

Stack Overflow用户

发布于 2016-08-19 09:33:12

您可以尝试一个联接,而不是一个子选择。类似于:

代码语言:javascript
复制
select p1.product_id, p1.count(*) as cnt 
from order_product p1 JOIN order_product p2 on p1.order_id = p2. order_id
where p1.product_id != 155 
and p2.product_id = 155
group by p1.product_id 
order by p1.cnt desc 
limit 5;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39035626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档