【发布时间】:2023-03-09 10:47:01
【问题描述】:
我有以下疑问:
select ad_st_id_state, count(distinct id_visit) as Visits
from sf_visit
join vr_users on vi_us_id_user = sus_us_id_user
join sf_pdv on vi_pdv_id_pdv = id_pdv
join sf_address on pdv_ad_id_address = id_address
group by ad_st_id_state
order by ad_st_id_state
我也有这个:
select ad_st_id_state, count(distinct id_visit) as DoneVisits
from sf_visit
join vr_users on vi_us_id_user = sus_us_id_user
join sf_pdv on vi_pdv_id_pdv = id_pdv
join sf_address on pdv_ad_id_address = id_address
join sf_visit_file_time on id_visit = vft_vi_id_visit /* Another join has been added */
group by ad_st_id_state
order by ad_st_id_state
正如您所见,除了额外的join 语句之外,查询几乎相同。
这两个查询都返回了我需要的正确值,但我需要将它们加入一个表中,所以我这样做:
select fffuuu.ad_st_id_state, count(distinct id_visit) as Visitas, fffuuu.doneVisits
from sf_visit
join vr_users on vi_us_id_user = sus_us_id_user
join sf_pdv on vi_pdv_id_pdv = id_pdv
join sf_address on pdv_ad_id_address = id_address
join (
select ad_st_id_state, count(distinct id_visit) as doneVisits
from sf_visit
join vr_users on vi_us_id_user = sus_us_id_user
join sf_pdv on vi_pdv_id_pdv = id_pdv
join sf_address on pdv_ad_id_address = id_address
join sf_visit_file_time on id_visit = vft_vi_id_visit
group by ad_st_id_state
order by ad_st_id_state
) as fffuuu on sf_address.ad_st_id_state = fffuuu.ad_st_id_state
group by ad_st_id_state
order by ad_st_id_state
或者换句话说,我将第一个查询与第二个查询作为子查询连接起来。结果集很好且正确,但花费的时间太长,所以我在另一个系统中超时,这个查询正在运行。每个查询独立运行很快,但加入它们对我的需求来说太慢了......
我想知道是否有办法对此进行优化,我在想是否有一些加入条件语句之类的。我搜索了信息,但我没有任何运气。我在想这样的事情:
select ad_st_id_state, count(distinct id_visit) as Visits, if(@someVariable := true) as DoneVisits
from sf_visit
join vr_users on vi_us_id_user = sus_us_id_user
join sf_pdv on vi_pdv_id_pdv = id_pdv
join sf_address on pdv_ad_id_address = id_address
if (@someVariable == true) then join sf_visit_file_time on id_visit = vft_vi_id_visit
group by ad_st_id_state
order by ad_st_id_state
或者类似的东西。我该如何优化它?
【问题讨论】:
-
以下在 t-sql 中工作,所以我确信它也可以在 mysql 中工作添加一个类似的连接......在 id_visis = vft_vi_id_visit 和 @someVariable = 1 上加入 sf_visit_file_time
-
@SkelDave 我尝试了你的建议,但我不知道该怎么做,因为我在 MySQL 中遇到了语法错误。我刚刚编写了关于 someVariable 的代码,以阐明我想要做什么。
标签: mysql sql join optimization