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

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

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

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

Q&A

解決済

1回答

2291閲覧

【MySQL】GROUP BYした内容で優先順位をつける

k.k.k.k

総合スコア5

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

1グッド

1クリップ

投稿2020/03/14 16:27

前提・実現したいこと

あるテーブル"a"が有り、
そのテーブルにカラム"a_id"、"status"が有ります。

テーブル"a"にレコードが以下の用に登録されていると仮定します。

a_id|status
1|1
2|2
3|3
4|4
5|2
6|1

テーブル"b"では以下のようにデータが入っています。
そのテーブルにカラム"b_id"、"hoge_id"、"a_id"が有ります。
b_id|hoge_id|a_id
1|1|1
2|1|2
3|1|3
4|1|4
5|2|5
6|2|6

※aに登録されているstatusの値は抽出する優先順位が有り、
4
2
1
3
という優先順位で表示するとなっています。

該当のクエリ

この時に以下のようにGROUP BYしてデータを抽出するとします。
statusに優先順位に沿った集計内容を表示がしたいです。

MySQL

1SELECT 2 B.`hoge_id` AS hogeId 3 ,MIN(A.`status`) AS status -- ここでstatusの優先順位に沿った集計内容を取得したい 4FROM `a` AS A 5INNER JOIN `b` AS B 6ON A.a_id = B.a_id 7GROUP BY B.hoge_id;

期待する結果

期待する結果は以下のようになればいいなと思います。
hogeId|status
1|4
2|2

補足情報

MySQLを使用しており、バージョンは5.7となります。
初めての質問で拙い点があるかと思いますが、宜しくお願い致します。

s.k👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず無理やりやってみました。MySQL 8 ならウインドウ関数が使えるんですけどねぇ。
https://www.db-fiddle.com/f/uoj6g4riibCpLYUmzQEanN/0

テーブル定義

SQL

1create table a ( 2 a_id int primary key, 3 status int 4); 5 6insert into a values (1, 1); 7insert into a values (2, 2); 8insert into a values (3, 3); 9insert into a values (4, 4); 10insert into a values (5, 2); 11insert into a values (6, 1); 12 13create table b ( 14 b_id int primary key, 15 hoge_id int, 16 a_id int 17); 18 19insert into b values (1, 1, 1); 20insert into b values (2, 1, 2); 21insert into b values (3, 1, 3); 22insert into b values (4, 1, 4); 23insert into b values (5, 2, 5); 24insert into b values (6, 2, 6);

問い合わせ

SQL

1select 2 b.hoge_id, 3 case 4 min( 5 case a.status 6 when 1 then 3 7 when 2 then 2 8 when 3 then 4 9 when 4 then 1 10 end 11 ) 12 when 1 then 4 13 when 2 then 2 14 when 3 then 1 15 when 4 then 3 16 end as status 17from a join b 18 on a.a_id = b.a_id 19group by b.hoge_id;

実行結果

+---------+--------+ | hoge_id | status | +---------+--------+ | 1 | 4 | | 2 | 2 | +---------+--------+

投稿2020/03/14 19:59

hoshi-takanori

総合スコア7895

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

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

k.k.k.k

2020/03/16 02:24

ご回答いただきありがとうございます! 自分の方でも試したところ期待通りの結果を得ることができました。 この度はありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問