有没有办法在MySQL中临时存储查询结果?

时间:2020-04-16 16:09:48

标签: mysql sql

因此,我一直在尝试提高此代码的复杂性。我搜索了很多SO问题,但我认为这不是我想要的。我想获得10个最长和最短的预期寿命国家-这就是UNION的宗旨。如您所见,有两个相同的子查询。

(SELECT *
FROM 
    (SELECT name, life_expectancy 
    FROM country_info
    WHERE life_expectancy!="null") AS life_expectancy_table
ORDER BY life_expectancy DESC
LIMIT 10)
UNION
(SELECT *
FROM 
    (SELECT name, life_expectancy 
    FROM country_info
    WHERE life_expectancy!="null") AS life_expectancy_table
ORDER BY life_expectancy
LIMIT 10)

我怀疑子查询正在运行2次,这是我要避免的事情。而且,即使查询没有运行两次,我也想使用别名来提高可读性。

1 个答案:

答案 0 :(得分:0)

您的查询是一种很好的方法,但不需要那么多子查询:

(SELECT name, life_expectancy 
 FROM country_info
 WHERE life_expectancy <> 'null' 
 ORDER BY life_expectancy DESC
 LIMIT 10
) UNION  -- intentional to remove duplicates
(SELECT name, life_expectancy 
 FROM country_info
 WHERE life_expectancy <> 'null'
 ORDER BY life_expectancy
 LIMIT 10
);

life_expectancy将存储为字符串似乎很奇怪。您可能打算life_expectancy IS NOT NULL

您还可以使用窗口功能执行此操作:

 SELECT name, life_expectancy 
 FROM (SELECT ci.*,
              ROW_NUMBER() OVER (ORDER BY life_expectancy DESC) as seqnum_desc,
              ROW_NUMBER() OVER (ORDER BY life_expectancy ASC) as seqnum_asc
       FROM country_info ci
       WHERE life_expectancy <> 'null'
      ) t
 WHERE seqnum_desc <= 10 OR seqnum_asc <= 10;
相关问题