MySQL选择,子查询等

时间:2016-08-04 17:30:44

标签: mysql greatest-n-per-group

我遇到了一个复杂的问题。选择。我有不同的表(每年一个),它们看起来像:

去年:

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,即名字One'。这同样适用于Nam2。

Nam4不会出现在2016年,但会在2015年出现,所以我想选择名称AltFour'。

最终选择将是:

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

2016年至2013年我有桌子。非常感谢你的帮助。

1 个答案:

答案 0 :(得分: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.

如果速度很慢,可以在临时表中添加(ShortNameYear)索引。