相关子查询 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的主要内容,如果未能解决你的问题,请参考以下文章