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

解決済みの質問

OUTER JOIN とgroup by

こんにちは。

mysqlのselect文なのですが、LEFT OUTER JOIN した右側をgroup byし、そのなかで最大値を持つものを結び付けたいのですが、四苦八苦やってみたところ2日ほど解決できず・・・。

どなたかご教授いただけますと助かります。
テーブルなどは以下の通りです。

---tableA----(テーブル名)
user / supplier(カラム名、以下レコード)
1 / 1
1 / 2
1 / 3
2 / 1
2 / 3

---tableB---
skuno / supplier / update_at
1 / 1 / 2011-12-12
2 / 1 / 2011-12-13
3 / 1 / 2010-11-10

検索の目的は、特定のカラムuserに対応する(例えばuser = 1)supplierの値(1,2,3)を取り出し、tableBにおいて、それぞれの値に結びつくskunoのうち最新のupdate_atを持つskunoを取り出したいというものです。

上記の例の場合、希望する検索結果は以下のような想定です。
supplier / skuno
1 / 2
2 / null
3 / null

私が検討してみたsql文は以下の通りなのですが、

select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where tableA.user = 1 and tableB.update_at IN (select max(update_at) from tableB group by supplier) group by tableA.supplier;

この場合だと、右側がnullだとsupplierの値が表示されず、

supplier / skuno
1 / 2

となってしまいます。

select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where user = 1 group by supplier;

だと右側のテーブルの値が指定できず・・・

ここからどのように条件付けをしたらよいのか、お力添えをいただけますと幸いです。

よろしくお願い申し上げます。

投稿日時 - 2011-12-19 02:42:25

QNo.7197797

困ってます

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

こうすれば希望する検索結果になるんじゃないでしょうか
SELECT a.supplier,b.skuno,max(update_at) from a
LEFT JOIN b ON a.supplier = b.supplier
WHERE a.user = 1 GROUP BY a.supplier;

問題はupdate_atフィールドで、「update_at IN (select max」の条件が適用される時、結合テーブルからsupplier2,3が消えるのが困るわけですよね。

投稿日時 - 2011-12-19 06:47:31

お礼

まさにその通りです!

なんだかややこしい方に考えてしまっていたみたいで・・・。

お力添えの程、ありがとうございましたm(_ _)m

投稿日時 - 2011-12-19 15:33:00

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

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

回答(3)

ANo.3

こうですね

select a.supplier,b.skuno
from tableA as a
left join tableB as b on b.supplier=a.supplier
and (b.supplier,b.update_at) IN (select supplier,max(update_at) as update_at from tableB group by supplier)
where user=1

投稿日時 - 2011-12-19 10:01:04

ANo.2

こんな感じでしょうか・
MySQLの環境が無く動作確認はしていないので、文法エラーなどがあったら適宜修正してください。

select A.supplier, B.skuno
from tableA as A
left join tableB as B on (
A.supplier = B.supplier
and B.update_at IN (
select max(update_at)
from tableB as B2
where B.supplier = B2.supplier
group by supplier))
where A.userid = 1;

投稿日時 - 2011-12-19 09:34:59

あなたにオススメの質問