2016-08-04 18 views
0

「複雑な」選択に問題があります。私は別のテーブル(年間1)を持っている、と彼らは次のようになります。昨年MySQL選択、サブクエリなど

:個人が2つ(またはそれ以上に表示されたときに、ある

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を選択します。つまり、Nam16個体が2016年と2015年に登場します。私は彼女の最後のLongNameを選択したいのですが、これは「名前1」です。 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

データベースの最初のルールは、4つの異なるテーブルで4年間テーブルを分割しないでください。データベースの第2の規則は、4つの異なるテーブルに4年間テーブルを分割しないでください。 'union all'を使用して素敵なインデックスを使用しないために遅いことを除いて、間違いを修正して、それをただ一つのテーブルのように照会することができます:' select * from(select * from table1 union all select * from table2 union all ...)aが存在しない(select * from(select * 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. 

それが遅い場合は、一時テーブルに(ShortNameYear)インデックスを追加することができます。

関連する問題