首先,让我解释一下我的数据结构。
我有一个名为 profile 的模型,witch 是服务提供商的配置文件。服务提供商可以从两种不同类型的“旅行”中进行选择(两者都有,也没有任何一种)。第一种出行方式是“我可以去客户那里”。为此,服务提供商需要输入他可以前往的所有城市(多对多)。第二种“旅行”模式是“我的客户可以来找我”。那些,他从列表中选择他所在的城市(一对多)。
对于“我可以去客户”旅行模式,我有一个带有 profile_id 和一个 local_id 的 locals_profile 表以及一个带有城市名称的 locals 表。
对于“我的客户可以来找我”,我有一个带有 profile_id 和 city_id 的位置表和一个带有城市名称的城市表。
在您问之前,由于项目建模中的其他事情,我不能在两种情况下都使用同一张表作为城市名称(如果可以的话,性能会提高吗?)。
此外,配置文件属于许多子类别,请给我们带来另一个名为 profiles_sub_categories 的表,其中包含 sub_category_id 和 profile_id 字段。
我想要的是,给定一个子类别,显示我在每个城市有多少物品。例如:
- 对于“设计师”子类别:
- 纽约 (100)
- 旧金山 (50)
- 迈阿密 (10)
- ...(最多 10 个城市)
我已经通过以下查询完成了我想要的内容:
select q1.city_name, if(q1.city_count is null, 0, q1.city_count) + if(q2.city_count is null, 0, q2.city_count) city_count
from
(select l.name as city_name, count(*) as city_count from locals_profiles lp
inner join locals l on l.id = lp.local_id
inner join profiles p on p.id = lp.profile_id
inner join profiles_sub_categories ps on ps.profile_id = p.id
where ps.sub_category_id = 97 and l.level = 2
group by 1) q1
left join
(select c.name as city_name, count(*) as city_count from cities c
inner join locations lo on lo.city_id = c.id
inner join profiles p on lo.profile_id = p.id
inner join profiles_sub_categories ps on ps.profile_id = p.id
where ps.sub_category_id = 97
group by 1) q2
on q1.city_name = q2.city_name
order by 2 DESC
limit 10;
但是查询需要很长时间才能执行。由于它是一个网络应用程序,我需要它几乎是即时的。有谁知道更好的方法来做我正在尝试的事情?