- ベストアンサー
重複データを除外して条件をつけたい
- 重複データを除外して、種別ごとに最新の入荷日付を抽出したいです。
- MySQLバージョン4.1.21を使用していますが、group byやサブクエリを試しても期待する結果が得られません。
- 困っているので、どなたか詳しい方に助言をいただきたいです。
- みんなの回答 (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
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
まず種別で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
お礼
お答えありがとうございます! こちらのテスト環境で試したところ、ばっちり望み通りの結果がでました。 (このような形のサブクエリはやった事がなかったので大変参考になります。) ただ、問題が発生しました。 これを本番環境に移して実行したところ、 テスト環境と本番環境ではMYSQLのバージョンが違うらしく、 構文エラーが出てしまいました。 面喰って調べたところ、本番環境では、4.0.24を使っており、上記の記述では無理らしいのです。 私の調査不足で大変申し訳ありません。 MYSQL4.0系でも対応できる(create temporary table等の)別の記述方法で、同じ結果が出ないものでしょうか? もしおわかりになりましたら助かります。 どうぞよろしくお願い致します。
お礼
御礼が大変遅くなってしまい申し訳ありません! 上記の方法でもやってみたところ問題なく結果を出す事が出来ました。 このSQLを実装用にアレンジし、PHPでのデータ加工を加えて無事望むソースが完成しました。 私はよくSQLの記述でつまづくので今後はより学習に努めたいと思います。yambejp様の的確なアドバイスで効率的なソースを作る事ができたこと、本当に感謝申し上げます。