-1

遅い大きなSQLクエリ(MySQL用)があります。これは、2つの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 から派生した 2 つのフィールドが必要です。 2番目のものからUNIONし、2番目の部分の順序を乱すことなく最初の部分内で順序付けできるようにします) - もちろん、後で追加のフィールドを再度スローする2番目のクエリが必要です:

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 に答える