-1

我有一个很慢的大型 SQL 查询(对于 MySQL)。它是两个 select 语句的联合。我尝试了不同的方法,但任何细微的差异都会给我带来与原始结果不同的结果。任何改进它的帮助将不胜感激。谢谢。这是SQL:

   (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 确实采用了一些插值(以美元符号 ($) 为前缀)。

4

1 回答 1

1

以下可能会给出相同的结果(我不确定如何在 SQL 中调用最大/最小函数,但您应该知道——您需要两个从 foo_count 派生的字段,它们将您的第一部分的项目分开UNION 与第二部分的 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,
    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

编辑:改进

于 2012-08-26T03:45:46.667 回答