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

締切り済みの質問

結合したテーブルに名前をつけるには?

お世話になります。

【前提】
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です。

投稿日時 - 2012-01-11 23:30:43

QNo.7239227

困ってます

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

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

回答(2)

ANo.2

>【目的】
>ユニークではない`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)・・・略。

投稿日時 - 2012-01-15 03:11:44

ANo.1

こんな感じ?

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などは予約語です。
慣れてないとすぐハマるのでなるべくフィールド名に使わない方がよいでしょう。

投稿日時 - 2012-01-12 13:44:12