MySQL - 列的条件连接

标签 mysql sql join optimization

我有以下查询:

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

或者类似的东西。我该如何优化它?

最佳答案

您能否在计数中使用 sf_visit_file_time 的外连接和 case 语句?显然,我在本地没有您的架构,但类似于:

select ad_st_id_state, 
   count(distinct id_visit) as Visits,
   count(distinct case when vft_vi_id_visit is not null then id_visit end) 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
left join sf_visit_file_time on id_visit = vft_vi_id_visit
group by ad_st_id_state
order by ad_st_id_state

关于MySQL - 列的条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26721974/

相关文章:

mysql - 多重内连接关注点

php - MYSQL 列的默认值无效

php - mysql 的双重输出。我想知道我做错了什么

MySQL SUM() 基于多个条件

php - MySQL - 提取非现有 ID 的替代方法

php - 使用 laravel 从多个表进行多个查询

mysql获取数据并在另一个表中查找

php - 搜索 MySQL 数据库

c# - 从 C# 将数据库名称作为变量传递给 SQL。是否可以?

sql - 如何根据连接更新特定行的值?