相关子查询 MySQL

Posted

技术标签:

【中文标题】相关子查询 MySQL【英文标题】:Correlated subqueries MySQL 【发布时间】:2021-03-24 21:56:38 【问题描述】:

显然我不明白子查询的相关性 在引擎盖下工作。

我有以下“销售”表架构: sale_id|sale_date|product_type

我的目标是计算某种类型的已售产品占产品总数的比例 当天售出。

例如:

1. 2015-01-03 product_1
2. 2015-01-03 product_1
3. 2015-01-03 product_3
4. 2015-01-04 product_4
5. 2015-01-05 product_1

product_1 我的输出应该是:

2015-01-03 0.667
2015-01-04 0
2015-01-05 1

这是我对代码的想法(我们从外部查询 s1 和 在内部查询中使用它执行选择查询)。显然这不起作用:


select distinct s1.sale_date, count(select * from sales s2
                                    where s2.sale_date = s1.sale_date
                                    and s2.product_type = 'product1')/
                              count(select * from sales s3
                                    where s3.sale_date = s1.sale_date)
from sales s1

请帮我解决这个问题!

【问题讨论】:

大概,'1'-'5'是主键ID? 对每个单独的行执行关联子查询,并将关联子查询文本中外部表的行列替换为该行的值。因此,对于sale_date='2015-01-03' 所在的行,相关子查询将作为select * from sales s2 where s2.sale_date = '2015-01-03' and s2.product_type = 'product1' 执行。 【参考方案1】:

您要编写的查询在子查询中有计数:

select distinct s1.sale_date
    (select count(*) from sales s2 where s2.sale_date = s1.sale_date and s2.product_type = 'product1')
    / (select count(*) from sales s2 where s2.sale_date = s1.sale_date) as ratio
from sales s1

但是,这确实是低效的。您所要求的通过条件聚合完成要简单得多,如下所示:

select sale_date, avg(product_type = 'product1') as ratio
from sales
group by sale_date

这会将数据按sale_date 分组;当产品类型匹配时,product_type = 'product1' 评估为1,否则为0。您可以在每个组中平均该值以获得该产品的每日比率。

【讨论】:

感谢您的帮助!我会努力的!

以上是关于相关子查询 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL子查询(六)

MySQL子查询

MySQL子查询

Mysql第八期 子查询

JOIN 语法中的 MySQL 相关子查询

相关子查询 MySQL