0

首先,让我解释一下我的数据结构。

我有一个名为 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;

但是查询需要很长时间才能执行。由于它是一个网络应用程序,我需要它几乎是即时的。有谁知道更好的方法来做我正在尝试的事情?

4

1 回答 1

0

我发现 mysql 在优化查询方面做得不好。简单的解决方案是编写两个查询并将它们合并到应用程序层。令人惊讶的是,它可能会更快......

或者,您可以尝试消除视图 (q1,q2) 并多次为相同的表设置别名。可能很难做到正确......

于 2012-09-04T23:55:39.917 回答