MySQL Select、子查询等

MySQL Select, subqueries, and more

我遇到了 'complicated' select 的问题。我有不同的表格(每年一张),它们看起来像:

去年:

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每年都可以不同。多年来,这些人可能会(也可能不会)重复。

我想 select 所有表中所有个人的最新 LongName。我的意思是,个人 Nam1 出现在 2016 年和 2015 年。我想 select 她最后一个可用的 LongName,即 'Name One'。 Nam2也是如此。

Nam4 没有出现在 2016 年,但它出现在 2015 年,所以我想 select 'Name AltFour'。

最后的 select 将是:

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

我有2016年到2013年的表格,非常感谢你的帮助。

像这样的东西应该可以工作:

-- 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)索引