2016-08-04 2 views
0

У меня проблемы с «сложным» выбором. У меня есть разные таблицы (один год), и они выглядят как:Выбор MySQL, подзапросы и т. Д.

В прошлом году:

ShortName LongName Year 
Nam1  Name One 2016 
Nam2  Name Two 2016 
... 
Namn  Name N 2016 

Год 2015

ShortName LongName  Year 
Nam1  Name AltOne 2015 
Nam4  Name AltFour 2015 
... 
Namn  Name AltN  2015 

То есть, когда человек появляется в двух (или более) лет, наблюдения имеют одно и то же ShortName, но LongName может отличаться каждый год. Люди могут (или не могут) повторяться на протяжении многих лет.

Я хочу выбрать последнее LongName для всех лиц во всех таблицах. Я имею в виду, что отдельный Nam1 появится в 2016 году и в 2015 году. Я хочу выбрать ее последнее доступное LongName, которое является «Name One». То же самое относится к Nam2.

Nam4 НЕ появляется в 2016 году, но в 2015 году, поэтому я хочу выбрать «Name AltFour».

Окончательный выбор будет:

ShortName LongName  Year 
Nam1   Name One  2016 
Nam2   Name Two  2016 
Nam4   Name AltFour 2015 
Namn   Name N  2016 

У меня есть таблицы с 2016 до 2013 г. Большое спасибо за вашу помощь.

+0

Первое правило баз данных, не разбивайте таблицу в 4 разных таблицах на 4 года. Второе правило баз данных не разбивает таблицу в 4 разных таблицах на 4 года. Вы можете устранить свою ошибку, кроме того, что она медленная из-за не использования хороших индексов, с помощью «union all», а затем запросить ее, как если бы она была только одной таблицей: 'select * from (select * from table1 union all выберите * from table2 union all ...) a, где не существует (выберите * from (выберите * из table1 union all select * from table2 union all ...) a1 где a1.Shortname = a.Shortname и a.Year Solarflare

+0

Спасибо за ваш комментарий. Причина, почему у меня разные таблицы, заключается в том, что у меня разные переменные за каждый год, кроме соответствующих проблем. – Javi

+0

Javi, вам, вероятно, было бы лучше создавать таблицы для различных наборов переменных, связанных с таблицей «годы». – Uueerdo

ответ

0

Что-то, как это должно работать:

-- Create a temporary singular table of the shared fields. 
-- Ideally, the actual table probably should've looked something like this. 
DROP TEMPORARY TABLE IF EXISTS tmpAll; 
CREATE TEMPORARY TABLE `tmpAll` 
SELECT ShortName, LongName, `Year` FROM table2016 
UNION SELECT ShortName, LongName, `Year` FROM table2015 
UNION SELECT ShortName, LongName, `Year` FROM table2014 
UNION SELECT ShortName, LongName, `Year` FROM table2013 
; 

-- Find the most recent years for each name. 
-- This could have just been a subquery of the next/last query; but... 
-- MySQL does not support queries that reference a TEMPORARY table more than once. 
DROP TEMPORARY TABLE IF EXISTS tmpRecents; 
CREATE TEMPORARY TABLE `tmpRecents` 
SELECT Shortname, MAX(`Year`) AS `Year` 
FROM tmpAll 
GROUP BY ShortName 
; 

-- Get the tmpAll records for the most recent year of each ShortName 
SELECT tmpAll.* 
FROM tmpAll INNER JOIN `tmp` USING (ShortName, `Year`) 
; 

-- You can DROP the temporary tables here, or 
-- they will just go away when the connection is closed. 

Если это медленно, вы можете добавить индекс (ShortName, Year) для временных таблиц.