Mysql 如何改进这个庞大的SQL查询?
我对MySQL有一个很大的SQL查询,速度很慢。它是两个select语句的并集。我尝试了不同的方法,但任何微小的变化都会给我一个与原来不同的结果集。如有任何改进,我们将不胜感激。谢谢以下是SQL:Mysql 如何改进这个庞大的SQL查询?,mysql,sql,Mysql,Sql,我对MySQL有一个很大的SQL查询,速度很慢。它是两个select语句的并集。我尝试了不同的方法,但任何微小的变化都会给我一个与原来不同的结果集。如有任何改进,我们将不胜感激。谢谢以下是SQL: (SELECT CONCAT(city_name,', ',region) value, latitude, longitude, id, population,
(SELECT
CONCAT(city_name,', ',region) value,
latitude,
longitude,
id,
population,
( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) )
AS distance,
CASE region
WHEN '$region' THEN 1
ELSE 0
END AS region_match
FROM `cities`
$where and foo_count > 5
ORDER BY region_match desc, foo_count desc
limit 0, 11)
UNION
(SELECT
CONCAT(city_name,', ',region) value,
latitude,
longitude,
id,
population,
( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) )
AS distance,
CASE region
WHEN '$region' THEN 1
ELSE 0
END AS region_match
FROM `cities`
$where
ORDER BY region_match desc, population desc, distance asc
limit 0, 11)
limit 0, 11
SQL确实采用一些以美元符号$为前缀的插值 以下可能给出相同的结果我不确定在SQL中如何调用最大/最小函数,但是您应该有一个想法-您需要两个从foo_count派生的字段,这两个字段将联合的第一部分的项目与第二部分的项目分开,并允许在第一部分中排序,而不会干扰第二部分中的顺序-当然,稍后您需要第二个查询来再次抛出其他字段:
SELECT
CONCAT(city_name,', ',region) value,
latitude,
longitude,
id,
population,
( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) )
AS distance,
min ( 6, max (foo_count, 5)) AS group_discriminator,
max ( 6, foo_count) AS rank_for_use_in_first_group,
CASE region
WHEN '$region' THEN 1
ELSE 0
END AS region_match
FROM `cities`
$where
ORDER BY group_discriminator desc, region_match desc, rank_for_use_in_first_group desc, population desc, distance asc
limit 0, 11
编辑:改进您希望实现什么?你想先得到最高的食物数吗?或者,有一个几乎相同的查询的联合的原因是什么?区别在于foo_计数的顺序。当我尝试在单个查询中组合ORDER BY时,结果是不同的。是的,我先要最高的食物数。感谢Max和Min,你们想要的是最大的和最小的。这些在MySQL上可用,但在SQL Server上不可用。是的,siride是正确的。一旦我把“最大/最小”放在“最大/最小”上,SQL就工作了。我得调查一下结果是否和原来的一样。谢谢,是的!这给了我和我使用的大联盟一样的结果,谢谢!!