Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何改进这个庞大的SQL查询?_Mysql_Sql - Fatal编程技术网

Mysql 如何改进这个庞大的SQL查询?

Mysql 如何改进这个庞大的SQL查询?,mysql,sql,Mysql,Sql,我对MySQL有一个很大的SQL查询,速度很慢。它是两个select语句的并集。我尝试了不同的方法,但任何微小的变化都会给我一个与原来不同的结果集。如有任何改进,我们将不胜感激。谢谢以下是SQL: (SELECT CONCAT(city_name,', ',region) value, latitude, longitude, id, population,

我对MySQL有一个很大的SQL查询,速度很慢。它是两个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确实采用一些以美元符号$为前缀的插值

以下可能给出相同的结果我不确定在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就工作了。我得调查一下结果是否和原来的一样。谢谢,是的!这给了我和我使用的大联盟一样的结果,谢谢!!