
お世話になります。
【前提】
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です。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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)・・・略。
No.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などは予約語です。
慣れてないとすぐハマるのでなるべくフィールド名に使わない方がよいでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
結合したテーブルに名前をつけ...
-
count関数の値をwhere句で使用...
-
SQLローダーCSV取込で、囲み文...
-
Oracleで「文字が無効です」の...
-
単一グループのグループ関数で...
-
並べ替えについて
-
where句中のtrim関数について
-
トランザクションログを出力せ...
-
データ
-
select文の実行結果に空白行を...
-
アクセスの並べ替えについて
-
osqleditについて
-
SELECTした合計値をそのまま割...
-
タイトル行を固定してソートしたい
-
【PL/SQL】FROM区に変数を使う方法
-
Selectした時のレコードの取得順
-
SELECT FOR UPDATE で該当レコ...
-
ハイフンの入ったデータの並べ替え
-
ACCESS レコードの並び順について
-
group byの並び順を変えるだけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
count関数の値をwhere句で使用...
-
OUTER JOIN とgroup by
-
結合したテーブルに名前をつけ...
-
小数点以下桁数が最大の値に小...
-
同一カラム名でjoinしたところ...
-
【PHP5+MySQL5】 count(*)の値...
-
重複レコードの抽出
-
初心者、SQLで分からない問題が...
-
最大値の数をカウントしたい
-
ストアドファンクションの再帰...
-
複雑なSQLを一発で実行
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
単一グループのグループ関数で...
-
Oracleで「文字が無効です」の...
-
select文の実行結果に空白行を...
-
並べ替えについて
-
データ
-
レコードの登録順がおかしい
-
SQL*Loader Append
おすすめ情報