お世話になります。
【前提】
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で質問しましょう!
似たような質問が見つかりました
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
joinの場合のテーブル名の別名の使用方法
PostgreSQL
-
GROUP BYを行った後に結合したい。
Oracle
-
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
-
4
「ORA-00907: 右カッコがありません」について
Oracle
-
5
重複していないレコードの抽出方法について
MySQL
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
8
実行時エラー3131 FROM 句の構文エラーです について
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
count関数の値をwhere句で使用...
-
OUTER JOIN とgroup by
-
SQL 自己結合で件数の条件指定
-
SQL 重複レコードの数え方
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
2つの列が同じ値の行を取得するSQL
-
AccessのSQL文で1件のみヒット...
-
データ
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
SELECT FOR UPDATE で該当レコ...
-
group byの並び順を変えるだけ...
-
Oracleで「文字が無効です」の...
-
トランザクションログを出力せ...
-
アクセスのレポートでレコード...
-
where句中のtrim関数について
-
<SQL>重複しているデータの場合...
-
SQL*Loader Append
-
【PL/SQL】FROM区に変数を使う方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
count関数の値をwhere句で使用...
-
OUTER JOIN とgroup by
-
結合したテーブルに名前をつけ...
-
最大値の数をカウントしたい
-
グループ内最大値に印を付けるS...
-
SQL 自己結合で件数の条件指定
-
【バグ?】ORDER BY DESCでempty
-
同一カラム名でjoinしたところ...
-
ビュー定義に集約関数を入れる...
-
ストアドファンクションの再帰...
-
市区町村別の件数をカウントす...
-
SQL 重複レコードの数え方
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
【PL/SQL】FROM区に変数を使う方法
-
AccessのSQL文で1件のみヒット...
-
レコードの登録順がおかしい
-
SELECT FOR UPDATE で該当レコ...
おすすめ情報