質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

3011閲覧

MySQLでサブクエリを使用せずGROUP BYとJOINを併用したい

tmykndr

総合スコア74

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2019/07/13 08:05

MySQLのサブクエリを使わずに、あるデータを取得したいのですがうまくクエリを作成できません。
もしかするとその考え方自体がナンセンスなのかもしれませんが、もしアドバイスをいただけたら嬉しいです。
今回使用しているテーブル構成が分かるように下記にキャプチャを貼ります。(データの行数が多いので一部を抜粋しています)

やりたいこと

  • サブクエリを使わずに、playersテーブルから、各ポジションごとに一番身長が高いプレイヤーを取得したい
  • 取得するcolumnはposition, MAX(height), name

イメージ説明

以下のようにサブクエリを使えば、うまく取得できます

SELECT p1.position, p1.aaa, p2.name FROM (SELECT position, MAX(height) AS aaa FROM players GROUP BY position) p1 JOIN players p2 ON p1.position = p2.position AND p1.aaa = p2.height;

イメージ説明

データを取得できないクエリ

SELECT p1.position, MAX(p1.height), p2.name FROM players p1 GROUP BY position JOIN players p2 ON p1.position = p2.position AND MAX(p1.height) = p2.height;

自分では、こちらのクエリでも、サブクエリ同様にGROUP BYでまとめたp1テーブルにp2テーブルをJOINしているのでサブクエリを使わなくてもデータ取得が行えると思いましたがsyntax errorで取得できませんでした。

もしわかる方がいましたら教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/07/13 09:37

MySQLのバージョンは幾つでしょうか。 ただ、これはサブクエリが必須ではないかと私は思います。
tmykndr

2019/07/13 10:24

回答いただきありがとうございます!やはりこの場合ですと必須なのですかね。今出先のためMySQLのバージョンの確認難しいので、確認でき次第、載せさせていただきます。
m.ts10806

2019/07/13 10:36

こちらは回答ではなく質問への追記修正依頼のコメント欄です。
guest

回答2

0

ベストアンサー

自分では、こちらのクエリでも、サブクエリ同様にGROUP BYでまとめたp1テーブルにp2テーブルをJOINしているのでサブクエリを使わなくてもデータ取得が行えると思いましたがsyntax errorで取得できませんでした。

はい、普通にJOINを行うと、それはGROUP BYより前に処理されます。GROUP BYの結果とJOINするには、「GROUP BYの結果」全体をサブテーブルにする必要があります。

投稿2019/07/13 10:58

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmykndr

2019/07/13 11:11

回答ありがとうございます!! なるほど理解できました!!だからサブクエリじゃないと取得できなかったのですね。 とてもスッキリしました!ありがとうございました!m()m
guest

0

SQLでは原則として、GROUP BY 句の要素以外は集計値しかSELECTできません。
ですからサブクエリ(のようなものも含めれば)は必須です。

投稿2019/07/13 09:58

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmykndr

2019/07/13 10:44

回答いただきありがとうございます!! 回答いただいた内容について質問させてくださいm()m > GROUP BY 句の要素以外は集計値しか SELECT できません。 今回 SELECT には3つのcolumnを指定していますが、GROUP BY しているのは p1テーブルなので、SELECT p1.position, MAX(p1.height), としています。 (この2つのcolumnはGROUP BYで取得できるcolumnのルールに反していないはず) そしてもう一つ SELECT 句に書いてある p2.name は GROUP BY していない p2テーブルをJOIN して取得しようと思い、あのクエリを書きました。 GROUP BY を使用した時にSELECTできるルールについては知っていたので、その上でクエリを書いたのですが、どこかで認識間違いをしているんですかね。。。 もし考え方自体が間違っていたら、教えていただけるととても嬉しいです。 よろしくお願いします。
hihijiji

2019/07/15 01:05

データを取得できないクエリ は単純に構文エラーです。 JOINはFORM句に書くものであって、GROUP BY句 にJOINは書けません。
tmykndr

2019/07/15 06:19

回答ありがとうございます! GROUP BY句とJOIN句を併用した場合の処理順番について理解していなかったことが原因で、認識間違いをしていました。 ご指摘ありがとうございました!m()m
hihijiji

2019/07/15 06:48

「JOIN句」と理解してはいけません。 JOIN は FROM句を構成する結合演算子です、= とか AND とかの仲間だと思ってください。
tmykndr

2019/07/15 07:20

JOINは句ではないですね、失礼しました。分かりやすい解説ありがとうございます!m()m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問