首先,让我解释一下我的数据结构。
我有一个名为profile的模型,它是服务提供商的配置文件。服务提供商可以从两种不同类型的“旅行”中进行选择(这两种类型都可以,也没有)。第一种旅行模式是“我可以去客户那里”。为此,服务提供商需要输入他可以前往的所有城市(多到多)。第二个“旅行”模式是“我的客户可以来找我”。那些,他从一份名单中选择了自己的城市(一对多)。
对于“我可以去客户端”的旅行模式,我有一个带有profile_id和local_id的local_id表和一个具有城市名称的局部变量表。
对于“我的客户可以来找我”,我有一个带有profile_id和city_id的位置表和一个城市名称的城市表。
在询问之前,由于项目建模中的其他因素,在这两种情况下,我都不能使用相同的表作为城市名称(如果可以的话,性能会提高吗?)
此外,该配置文件属于许多sub_categories,女巫给我们带来了另一个表,称为profiles_sub_categories和sub_category_id和profile_id字段。
我想要的是,给定一个sub_category,显示我在每个城市有多少物品。例:
我用以下查询完成了我想要的内容:
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应用程序,我需要它几乎立即。有没有人知道更好的方法来做我想做的事?
发布于 2012-09-04 23:55:39
我发现mysql在优化查询方面做得不太好。简单的解决方案是编写两个查询并将它们合并到应用层。令人惊讶的是,它可能会更快..。
或者,您可以尝试删除视图(q1、q2)并多次对相同的表进行别名。可能很难纠正..。
https://stackoverflow.com/questions/12272468
复制相似问题