電子書籍の厳選無料作品が豊富!

下記(A)の状態から(B)のような結果を出したくて、group by やサブクエリなどで試行錯誤しましたが、
欲しい結果が取れず困っております。
どなたかわかる方、ご教授いただけましたら助かります。よろしくお願いいたします。
(MYSQLバージョン:4.1.21)

(A)
 NO|入荷日付|種別|名称
  3|20080730|2|りんご
  4|20080801|2|りんご
  5|20080728|2|りんご
  8|20080801|2|りんご
 10|20080812|2|りんご
  7|20080811|25|ぶどう
  9|20080811|25|ぶどう
  1|20080731|36|みかん
  2|20080728|36|みかん
  6|20080808|50|いちご

(B)抽出結果
 NO|入荷日付|種別|名称
 10|20080812|2|りんご
  9|20080811|25|ぶどう
  1|20080731|36|みかん
  6|20080808|50|いちご

■抽出条件
 ・【種別】ごとに【入荷日付】が最新のデータを1件だけ抽出。
 ・ NO:7やNO:9のデータのように、【種別】と【入荷日付】が同じ場合は、【NO】が最大のデータを抽出。

A 回答 (2件)

テンポラリをつかって同じコトができますね。


考え方は全く同じです。

CREATE TEMPORARY TEMPORARY TABLE temp
SELECT 種別,MAX(入荷日付) AS 入荷日付 FROM hoge
GROUP BY 種別;

CREATE TEMPORARY TABLE temp2
SELECT MAX(NO) AS NO
FROM hoge
INNER JOIN temp ON
hoge.種別=temp.種別
and hoge.入荷日付=temp.入荷日付
GROUP BY hoge.種別;

SELECT `hoge`.*
FROM hoge
INNER JOIN temp2
ON hoge.NO=temp2.NO
    • good
    • 0
この回答へのお礼

御礼が大変遅くなってしまい申し訳ありません!
上記の方法でもやってみたところ問題なく結果を出す事が出来ました。
このSQLを実装用にアレンジし、PHPでのデータ加工を加えて無事望むソースが完成しました。

私はよくSQLの記述でつまづくので今後はより学習に努めたいと思います。yambejp様の的確なアドバイスで効率的なソースを作る事ができたこと、本当に感謝申し上げます。

お礼日時:2008/08/27 11:08

まず種別でgroup by して入荷日付のmaxをとり、その値でinner joinする。


その結果を種別でgroup by してNOのmaxをとり、その値でinner joinする。

テーブル名をhogeとしてこんな感じで
SELECT `hoge`.*
FROM hoge
INNER JOIN
(SELECT MAX(NO) AS NO
FROM hoge
INNER JOIN (
SELECT 種別,MAX(入荷日付) AS 入荷日付 FROM hoge
GROUP BY 種別) AS temp ON
hoge.種別=temp.種別
and hoge.入荷日付=temp.入荷日付
GROUP BY hoge.種別) AS temp2
ON hoge.NO=temp2.NO
    • good
    • 0
この回答へのお礼

お答えありがとうございます!
こちらのテスト環境で試したところ、ばっちり望み通りの結果がでました。
(このような形のサブクエリはやった事がなかったので大変参考になります。)

ただ、問題が発生しました。
これを本番環境に移して実行したところ、
テスト環境と本番環境ではMYSQLのバージョンが違うらしく、
構文エラーが出てしまいました。
面喰って調べたところ、本番環境では、4.0.24を使っており、上記の記述では無理らしいのです。

私の調査不足で大変申し訳ありません。
MYSQL4.0系でも対応できる(create temporary table等の)別の記述方法で、同じ結果が出ないものでしょうか?
もしおわかりになりましたら助かります。
どうぞよろしくお願い致します。

お礼日時:2008/08/13 18:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!