Следующее поведение смутило меня, хотя я считаю, что имею опыт работы с базами данных. У меня есть 2 таблицы, одна для стран и одна для случаев covid на страну на дату. В основном они ...
2 ответа
Если вы используете MariaDB 10.2 или более поздней версии, вы можете использовать ROW_NUMBER()
в CTE, чтобы получить данные о последних обращениях для каждого country_id
, затем их можно присоединить к countries
, чтобы получить страну имя:
WITH latest AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY country_id ORDER BY date DESC) AS rn
FROM cases
)
SELECT c.name, l.active_cases, l.date
FROM latest l
JOIN countries c ON c.id = l.country_id
WHERE l.rn = 1
Выход:
name active_cases date
Argentina 30 2021
Brazil 300 2021
Cuba 3000 2021
Ecuador 30000 2021
Ваш внутренний запрос группируется по country_id
и сортируется по DESC. Тот факт, что он дает вам все результаты из 2021
в вашем примере, является случайным на основе данных в вашей таблице. Вот почему ваш объединенный запрос возвращает неожиданные данные.
Если вы ищете новейшие случаи, вам следует добавить явный ORDER BY
к своему внутреннему запросу, примерно так:
SELECT countries.*, active_cases, date
FROM countries
JOIN (
SELECT cases.country_id, active_cases, date
FROM cases
JOIN (
SELECT country_id, MAX(date) as target_date
FROM cases
GROUP BY country_id
) as latest
ON cases.country_id = latest.country_id
AND cases.date = latest.target_date
) as latest_cases
ON countries.id = latest_cases.country_id;
Изменить: замена на запрос с использованием вложенных подзапросов, но приведенный выше ответ работает с более чистыми разделами строк.
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.