web-dev-qa-db-ja.com

日付が最も高い行を選択する

テーブルで繰り返されている値がいくつかあります。最新/最高の日付を持つ値のみを選択したいと思います。

ID   Type     Name      Value        Date
--  -------   -----    -------       -------------
1   "FRUIT"  "Apple"  "Imported"  "2011-03-19 22:08:13"
5   "FRUIT"  "LEMON"  "Imported"  "2011-03-19 22:00:44"
22  "FRUIT"  "Peach"  "Imported"  "2011-03-20 11:03:13"
31  "FRUIT"  "MELON"  "Imported"  "2011-04-28 18:42:07"
44  "FRUIT"  "Peach"  "Imported"  "2011-04-12 11:06:11"
98  "FRUIT"  "CHERRY" "Imported"  "2011-03-19 22:46:04"
211 "FRUIT"  "MELON"  "Imported"  "2011-03-19 22:25:24"
217 "VEG"    "SPINACH""Imported"  "2011-03-19 22:25:24"

これらを選択したい:

ID   Type     Name      Value        Date
--  -------   -----    -------       -------------
1   "FRUIT"  "Apple"  "Imported"  "2011-03-19 22:08:13"
5   "FRUIT"  "LEMON"  "Imported"  "2011-03-19 22:00:44"
31  "FRUIT"  "MELON"  "Imported"  "2011-04-28 18:42:07"
44  "FRUIT"  "Peach"  "Imported"  "2011-04-12 11:06:11"
98  "FRUIT"  "CHERRY" "Imported"  "2011-03-19 22:46:04"

これは必要なものの簡略版です。テーブルには約20列あるので、*を選択します。そうでない場合は、1つずつ選択できます。

したがって、Type FRUITの*行を選択したいのですが、日付が最も高い行のみを選択します。ありがとうございました

20
London

これはあなたが望むものを与えるはずです:

_SELECT *
FROM Table
INNER JOIN 
(SELECT Name, MAX(Date) as TopDate
FROM Table
WHERE Type = 'FRUIT'
GROUP BY Name) AS EachItem ON 
    EachItem.TopDate = Table.Date 
    AND EachItem.Name = Table.Name
_

基本的には、果物の種類ごとに最新の日付を見つけて、各果物に行の情報(日付と果物の名前で結合)を表示します。 [日付]フィールドと[名前]フィールドの両方にインデックスが付けられていることを確認してください。

IDが最も高いアイテムが日付も最も高いアイテムであると想定できる場合(通常は、すべての場合に当てはまるとは限りません。ユースケースによって異なります)、代わりにMAX(ID)を実行できます。 MAX(Date)そして、日付と名前でリンクする代わりに、そのIDでリンクするだけを利用します。

33
IAmTimCorey

Mysqlを使用している場合、これはSELECTにすべてのタイプの「フルーツ」を並べ替え、日付を古いものから新しいものの順に並べます。

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC 

必要に応じて制限を設けることもできます(これは最も古い5つに制限されます)。

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC LIMIT 5 
10
Jason Small