- ベストアンサー
MySQLでの集計方法とテーブル結合についての質問
- MySQLを利用して複数のテーブルを集計する方法について質問です。
- 特定の条件に基づいてテーブルを結合し、重複するIDに対してステータスを保持する方法がわかりません。
- さらに、テーブルの数が不特定であるため、柔軟に集計を行う方法をご教示ください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>ステータスの優先順位が1>2>0>null なら1を最大値になるよう変換し、最後にもとに戻すとか。 (うまい方法が見つからなかっただけですが。。。) ---- SELECT * FROM テーブル1 ↓ SELECT ID, When ステータス1='1' then '10' else ステータス1 end as S1, ステータス2 as S2 FROM テーブル1 日付はDATETIME型ならmaxで問題ないと思います。
その他の回答 (5)
- yambejp
- ベストアンサー率51% (3827/7415)
あ、なんか違うので再チャレンジ
- yambejp
- ベストアンサー率51% (3827/7415)
>優先順位が正しくは1>2>0>nullの順番です。 なるほど、ではこんな感じで select id , case when 1 IN (t1.st1,t2.st1,t3.st1) THEN 1 when 2 IN (t1.st1,t2.st1,t3.st1) THEN 2 when 0 IN (t1.st1,t2.st1,t3.st1) THEN 0 else null end as st1 , case when 1 IN (t1.st2,t2.st2,t3.st2) THEN 1 when 2 IN (t1.st2,t2.st2,t3.st2) THEN 2 when 0 IN (t1.st2,t2.st2,t3.st2) THEN 0 else null end as st2 from( select id from t1 union select id from t2 union select id from t3 ) uni left join t1 using(id) left join t2 using(id) left join t3 using(id)
- o_chi_chi
- ベストアンサー率45% (131/287)
下記じゃだめでしょうか。 --- SELECT ID,MAX(ステータス1),MAX(ステータス2) FROM (SELECT * FROM テーブル1 UNION All SELECT * FROM テーブル2 UNION All SELECT * FROM テーブル3) GROUP BY ID
補足
回答ありがとうございます。 selectに条件を書くやり方もあったんですね。 TTT1の呼出し方法を聞こうと思っていたため、 細かい条件のところは自分でやろう思っていたので後出しになって申し訳ないのですが、 ステータスの優先順位が1>2>0>nullで、ステータス1、2が両方nullの場合は表示しません。 WHERE NOT(ステータス1 IS null AND ステータス2 IS null) で両方nullの場合の排除は出来たのですが、selectのところでの優先順位のつけ方がわかりません。 再度よろしくお願いいたします。 あと日付のカラムがあるんですが最新はMAX(日付1)最古はMIN(日付2)で問題ないですか?
- yambejp
- ベストアンサー率51% (3827/7415)
ごめんなさい、私の書き方がわるかったかもしれません。 ステータスの値がどちらのテーブルに寄せるかによって名前をどちらから 呼ぶかがかわってくるということです。 名前をよばないならidのリストにleft join すればよいかと。 (最小値に-999というダミーをいれていますが、ステータスがもっと 低いのが最大値になるようなら調整が必要) select id ,greatest(coalesce(t1.st1,-999),coalesce(t2.st1,-999),coalesce(t3.st1,-999)) as st1 ,greatest(coalesce(t1.st2,-999),coalesce(t2.st2,-999),coalesce(t3.st2,-999)) as st2 from( select id from t1 union select id from t2 union select id from t3 ) uni left join t1 using(id) left join t2 using(id) left join t3 using(id)
補足
どのテーブルが呼び出されるかが不確定なのでどれを優先っていうのはないのですが、逆にどれを優先しても構いません。 そして後出しになって大変申し訳ないのですが、ステータスの優先順位が正しくは1>2>0>nullの順番です。 対応出来ますでしょうか、よろしくお願いいたします。
- yambejp
- ベストアンサー率51% (3827/7415)
>IDが被っていた場合はステータスをそれぞれ大きいほうを保持 IDがかぶっていてステータスがかぶっていたらどっちをとるのでしょうか?
補足
回答ありがとうございます。 どちらでも構いません。 実際の環境では日付のカラムもいくつかあり、新しい日付を残すようにしたり、古い日付を残すようにしていたりするので、テーブル1を活かす、テーブル2を活かすというものではありません。 テーブル1のステータス1が0、ステータス2が2 テーブル2のステータス1が1、ステータス2が1 だった場合 ステータス1が1、ステータス2が2 を表示するようにしたいです。
お礼
再度のご回答ありがとうございます。 これで出来たと思います!! すごいシンプルになりましたね・・・。 う~ん、もっと勉強せねば。 ありがとうございました。