質問するログイン新規登録

Q&A

解決済

2回答

1676閲覧

MySQLで特定のIPアドレス含むかのフラグと集約を同時にしたい

eryngii

総合スコア1

MySQL

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

0グッド

0クリップ

投稿2021/02/21 07:04

編集2021/02/21 08:32

0

0

前提・実現したいこと

MySQLで特定のIPアドレス含むかどうかのフラグを含めたSELECT文を作成したい

fooテーブル

idfoo_idip
11aaa
21bbb
31ccc
42bbb
52ccc
62ddd
73aaa
84bbb

欲しい結果(ipアドレスがaaaの人が実行するてい)

idfoo_idcountflag
1131
2230
3311
4410

試したこと

元のテーブルにflagを追加

SQL

1CASE WHEN ip = 'aaa' THEN 1 ELSE 0 END as flag

foo_idとipでユニークなのでSUMでflagを取得

SQL

1SELECT id, foo_id, COUNT(*) AS count, SUM(flag) AS flag

これを組み合わせれば実現できそうですが、この先どうしていいかわからないので教えていただきたいです

補足情報(FW/ツールのバージョンなど)

MySQL 5.6

sql

1CREATE TABLE `default`.`foo` ( 2 `id` INT NOT NULL AUTO_INCREMENT , 3 `foo_id` INT NOT NULL , 4 `ip` VARCHAR(255) NOT NULL , 5 PRIMARY KEY (`id`) 6) ENGINE = InnoDB;

sql

1INSERT INTO `foo` (`id`, `foo_id`, `ip`) 2VALUES ('1', '1', 'aaa'), ('2', '1', 'bbb'), ('3', '1', 'ccc'), ('4', '2', 'bbb'), ('5', '2', 'ccc'), ('6', '2', 'ddd'), ('7', '3', 'aaa'), ('8', '4', 'bbb')

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

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

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

m.ts10806

2021/02/21 08:15

MySQLのバージョンは何でしょうか。 あと、テーブル定義(CREATE TABLE)とサンプルデータ(INSERT)を提示してください。
eryngii

2021/02/21 08:42

本文に書いてしまったのでこちらにも転記いたします バージョン MySQL 5.6 テーブル定義 CREATE TABLE `default`.`foo` ( `id` INT NOT NULL AUTO_INCREMENT , `foo_id` INT NOT NULL , `ip` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; サンプルデータ INSERT INTO `foo` (`id`, `foo_id`, `ip`) VALUES ('1', '1', 'aaa'), ('2', '1', 'bbb'), ('3', '1', 'ccc'), ('4', '2', 'bbb'), ('5', '2', 'ccc'), ('6', '2', 'ddd'), ('7', '3', 'aaa'), ('8', '4', 'bbb')
guest

回答2

0

ご回答いただいた内容をヒントに解決できました!

SQL

1select id, ip_list.foo_id, cnt, flag 2from foo 3inner join ( select foo_id , count(*) AS cnt , sum(case when ip='aaa' then 1 else 0 end) AS flag from foo group by foo_id ) ip_list on foo.id=ip_list.foo_id

投稿2021/02/21 09:45

eryngii

総合スコア1

0

ベストアンサー

こんな感じ。※欲しい結果のfoo_idについてはルールが分からないので無視しています。

SQL

1select id, foo_id, cnt, flag 2from foo inner join ( 3 select ip 4 , count(*) AS cnt 5 , sum(case when ip='aaa' then 1 else 0 end) AS flag 6 from foo 7 group by ip 8 ) ip_list 9 on foo.ip=ip_list.ip

投稿2021/02/21 09:06

編集2021/02/21 09:09
sazi

総合スコア25430

eryngii

2021/02/21 09:44 編集

欲しい結果になりませんでしたが下記SQLで解決できました ご回答のSQLが参考になりました! select id, ip_list.foo_id, cnt, flag from foo inner join ( select foo_id , count(*) AS cnt , sum(case when ip='aaa' then 1 else 0 end) AS flag from foo group by foo_id ) ip_list on foo.id=ip_list.foo_id
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問