こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

重複したデータの中で、一番新しい日付の値を表示したい

MySQLの構文についてお尋ねします。
使用しているMySQLのバージョンは5.0.45です。
+-----------------------------------------+
| id  | logno  | fig |   date  |
+-------+----------+-------+--------------+
| 1  | 11   | a  | 2008-06-01 |
| 1  | 11   | b  | 2008-06-05 |
| 1  | 11   | c  | 2008-06-10 |
| 1  | 12   | a  | 2008-06-01 |
| 1  | 13   | b  | 2008-06-01 |
| 1  | 13   | a  | 2008-06-10 |
| 2  | 11   | a  | 2008-06-01 |
+-------+----------+-------+--------------+
上記のtestテーブルの、
・id=1のデータ
・lognoごとに、dateが一番新しいもの
を抽出したいです。
SELECT logno,fig,MAX(date) FROM test WHERE id=1 GROUP BY logno
という構文を考えたのですが、結果を確認するとfigの値だけが一番dateが古いものになってしまいます。
+-----------------------------------------+
| id  | logno  | fig |   date  |
+-------+----------+-------+--------------+
| 1  | 11   | a  | 2008-06-10 |
| 1  | 12   | a  | 2008-06-01 |
| 1  | 13   | b  | 2008-06-10 |
+-------+----------+-------+--------------+
どのようにしたら
+-----------------------------------------+
| id  | logno  | fig |   date  |
+-------+----------+-------+--------------+
| 1  | 11   | c  | 2008-06-10 |
| 1  | 12   | a  | 2008-06-01 |
| 1  | 13   | a  | 2008-06-10 |
+-------+----------+-------+--------------+
という結果が得られるようになるでしょうか。

投稿日時 - 2008-06-10 15:47:11

QNo.4089797

すぐに回答ほしいです

質問者が選んだベストアンサー

こんな感じで

SELECT id,logno,fig,date
FROM test
where (id,logno,date) in (SELECT id,logno,MAX(date) FROM test WHERE id=1 GROUP BY logno)

投稿日時 - 2008-06-10 17:06:57

お礼

回答ありがとうございます!
この方法で希望通りの結果を得ることができました。
ずっと悩んでいたので、とても助かりました。
また、サブクエリのやり方など、いまひとつ理解できず使えなかったのですが、こちらの構文を見てこういう風に使えばいいのか…と理解できました。
本当に、ありがとうございました!

投稿日時 - 2008-06-11 09:56:39

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんなやり方も
select * from test t1
where t1.id=1
and not exists
( select 1 from test t2
where t1.logno=t2.logno
and t1.date< t2.date );

投稿日時 - 2008-06-11 02:05:14

お礼

回答ありがとうございます!
こちらの方法でも希望通りの結果を得ることができました。
自分の見たマニュアルなどでは全く見かけない構文なので、とても勉強になります。
ありがとうございました!

投稿日時 - 2008-06-11 09:58:19

ANo.2

同じような質問です。
http://okwave.jp/qa4089307.html
JOIN句とか微調整してください。
但し、MySQL 4.1以上でないとサブクエリは使えません。
もし、4.0以下の場合は、サブクエリの抽出結果を一時テーブルに
出力し、この一時テーブルと結合させます。

CREATE TEMPORARY TABLE XXX
SELECT logno,MAX(date) AS MaxDate FROM test GROUP BY logno;
SELECT A.* FROM test A,XXX B WHERE A.logno=B.logno AND A.date=B.MaxDate;
DROP TABLE XXX;

投稿日時 - 2008-06-10 16:23:01

お礼

回答ありがとうございます!
こちらのやり方ですと、残念ながらid=1のデータだけを抽出できませんでした…。
また、質問文に明記しておらず申し訳ありませんでしたが、「idごとにlognoの一番新しいもの」が必要なのです。

投稿日時 - 2008-06-11 09:52:08

仕様。

http://oshiete1.goo.ne.jp/qa3038229.html

投稿日時 - 2008-06-10 15:54:17

お礼

回答ありがとうございます!

投稿日時 - 2008-06-11 09:49:24

あなたにオススメの質問