首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL (mysql)查询改进

问SQL (mysql)查询改进
EN

Stack Overflow用户
提问于 2012-09-04 23:00:14
回答 1查看 72关注 0票数 0

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

我有一个名为profile的模型,它是服务提供商的配置文件。服务提供商可以从两种不同类型的“旅行”中进行选择(这两种类型都可以,也没有)。第一种旅行模式是“我可以去客户那里”。为此,服务提供商需要输入他可以前往的所有城市(多到多)。第二个“旅行”模式是“我的客户可以来找我”。那些,他从一份名单中选择了自己的城市(一对多)。

对于“我可以去客户端”的旅行模式,我有一个带有profile_id和local_id的local_id表和一个具有城市名称的局部变量表。

对于“我的客户可以来找我”,我有一个带有profile_id和city_id的位置表和一个城市名称的城市表。

在询问之前,由于项目建模中的其他因素,在这两种情况下,我都不能使用相同的表作为城市名称(如果可以的话,性能会提高吗?)

此外,该配置文件属于许多sub_categories,女巫给我们带来了另一个表,称为profiles_sub_categories和sub_category_id和profile_id字段。

我想要的是,给定一个sub_category,显示我在每个城市有多少物品。例:

  • 用于“设计人员”子类别:
    • 纽约(100)
    • 旧金山(50)
    • 迈阿密(10)
    • ..。(最多10个城市)

​

我用以下查询完成了我想要的内容:

代码语言:javascript
复制
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;

但是,查询执行的时间太长了。因为它是一个web应用程序,我需要它几乎立即。有没有人知道更好的方法来做我想做的事?

EN

回答 1

Stack Overflow用户

发布于 2012-09-04 23:55:39

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

或者,您可以尝试删除视图(q1、q2)并多次对相同的表进行别名。可能很难纠正..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12272468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档