- 締切済み
結合したテーブルに名前をつけるには?
お世話になります。 【前提】 Aテーブル |key|hoge|int1|int2| (keyはユニーク) Bテーブル |key|hogehoge| (keyはユニーク) 上記のテーブルを、下記のSQLで結合。 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` 【目的】 ユニークではない`A`.`hoge`の重複を省き、かつ、`kekka`が最大のものを選びたい。 【考え方】 `A`.`hoge`でグループ化し、max(`kekka`)を選ぶ。 【そのために】 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` IN(SELECT max(`kekka`) FROM `●●` GROUP BY `A`.`hoge`) ★質問です。 1)根本的に足りてない知識は何でしょうか? 2)上記の考え方で間違っていませんか? 3)●●には何を入れればよいでしょうか? (`A`を指定してみましたが、Unknown column 'kekka' in 'field list'といわれてしまいました) MySQLのバージョンは5.1.57です。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
>【目的】 >ユニークではない`A`.`hoge`の重複を省き、かつ、`kekka`が最大のものを選びたい。 で、なにが出したいのでしょう? >Aテーブル 例 |key|hoge|int1|int2| |111|hhhh|5234|1000| |222|hhhh|9999|1111| |333|jjjj|8888|2222| |444|kkkk|3333|1111| |555|kkkk|6666|2222| とあったら、 SELECT `A`.`key`・・・ は、 111とでる?222とでる?(2222を出したいのですかね。) 次に333とでるのはいいとして、 4444と5555は両方でる?4444がでる?5555がでる?(どちらも最大値)。 `B`.`hogehoge`もおなじ。 |key|hogehoge| |111|hhhhhhhh| |222|iiiiiiii| |333|jjjjjjjj| |444|ssssssss| |555|tttttttt| として、hhhhhhhh?iiiiiiii? ・・・ 4444と5555を両方だすなら、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`int1` / `A`.`int2` = (SELECT MAX(`X`.`int1` / `X`.`int2`) From `A` as 'X' where 'X'.`hoge` = `A`.`hoge`) 5555だけを出したいなら、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`key` in (SELECT max(`Y`.`key`) From `A` as 'Y' where `Y`.`int1` / `Y`.`int2` = (SELECT MAX(`X`.`int1` / `X`.`int2`) From `A` as 'X' where 'X'.`hoge` = `Y`.`hoge`) group by 'Y'.`hoge` ) あるいは、 SELECT `A`.`key`,(`A`.`int1` / `A`.`int2` ) as `kekka`, `B`.`hogehoge` From `A` left join `B` on `A`.`key` = `B`.`key` where `A`.`key` in (SELECT max(`Y`.`key`) From `A` as 'Y', left inner join (SELECT 'X'.`hoge`,MAX(`X`.`int1` / `X`.`int2`) as `kekka` From `A` as 'X') as 'Z' on 'Z'.`hoge` = 'Y'.`hoge' and `X`.`int1` / `X`.`int2` = `Z`.`kekka` group by 'Z'.`hoge` ) 4444だけを出したいなら、 max(`Y`.`key`) をmin(`Y`.`key`) にします。 ※MySQLは環境ないので未検証です。 >1)根本的に足りてない知識は何でしょうか? ・group byしたときの考え方 select A,B,max(C),min(D) from Q group by A,B というSQLで、max(C)とmin(D)は別のレコードの値がでてくることや、 group by句に含まれない項目は、集計用の関数(MaxやMin、Sumなどなど)を使わないと 値が特定できないので指定できない(エラーになる)こと ・In句の書き方 項目名 in (Select・・・)です。in(Select・・・)では構文エラーです、 というより何と比較するかわかりませn。 ・副問い合わせの使い方 上のを例としてみてください。 他。 ## こういう質問の仕方をされると、 ## つい「SQLの知識」って書いてしまいたくなるので ## 「どういった関数や機能を使ったらいいですか?」とかにしたほうがいいのでは? ## と思ってしまいます。 >2)上記の考え方で間違っていませんか? 上記を参照。 仕様の提示にも漏れがありますが、max(`kekka`)を選んでも、それではうまく特定できない というところが違ってました。 >3)・・・略。
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じ? select A.key,A.hoge,A.int1,A.int2,round(A.int1/A.int2,8) AS kekka,A.hogehoge from A left join B on A.key=B.key where (hoge,round(A.int1/A.int2,8)) IN (select hoge,max(round(A.int1/A.int2,8)) from A group by hoge) ちなみにkeyとかint1,int2などは予約語です。 慣れてないとすぐハマるのでなるべくフィールド名に使わない方がよいでしょう。