• ベストアンサー

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

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 | +-------+----------+-------+--------------+ という結果が得られるようになるでしょうか。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

こんな感じで 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)

quakeandb
質問者

お礼

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

その他の回答 (3)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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 );

quakeandb
質問者

お礼

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

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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;

quakeandb
質問者

お礼

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

回答No.1
quakeandb
質問者

お礼

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

関連するQ&A