Есть ли способ временно сохранить результат запроса в mySQL? - PullRequest
0 голосов
/ 16 апреля 2020

Итак, я пытался улучшить сложность этого кода. Я искал много вопросов 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 раза, и это то, чего я хочу избежать. Более того, даже если запрос не выполняется 2 раза, я хотел бы использовать псевдоним для улучшения читабельности.

1 Ответ

0 голосов
/ 16 апреля 2020

Ваш запрос является хорошим методом, но не требует так много подзапросов:

(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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...