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
)索引
我遇到了 '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
)索引