我遇到了一个复杂的问题。选择。我有不同的表(每年一个),它们看起来像:
去年:
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年我有桌子。非常感谢你的帮助。
答案 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.
如果速度很慢,可以在临时表中添加(ShortName
,Year
)索引。