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

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

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

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

Q&A

解決済

1回答

374閲覧

mySql で Group By して結果を取得する際に、Join 先に条件を指定したい。

sususu

総合スコア99

MySQL

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

0グッド

0クリップ

投稿2021/06/09 09:33

編集2021/06/09 13:15

mysql の初心者です。どなたかご教授いただければ幸いです。
よろしくお願いいたします。

テーブルが下記の通り二つあります。

area_area テーブル

id pref explaine 1 TOKYO this is tokyo1 2 TOKYO this is tokyo2 3 KANAGAWA this is kanagawa1 4 KANAGAWA this is kanagawa2 5 CHIBA this is chiba1 6 CHIBA this is chiba2

area_city テーブル

id name popularit area_id 1 AOYAMA 1 1 2 AKASAKA 1 1 3 NIPPORI 0 2 4 KURAMAE 0 2 5 YOKOSUKA 1 3 6 KAWASAKI 0 3 7 SAGAMI 1 4 8 YOKOHAMA 0 4

以前までは下記のようなコードで「県」のレコードが何件あるかを取得していました。

SELECT COUNT(a.pref) FROM area_area AS a GROUP BY a.pref; CHIBA 2 KANAGAWA 2 TOKYO 2

しかし今度は、紐づく area_city テーブルで popularity が最低でも一つある場合のみカウントしたいです。

id1の東京は AOYAMA AKASAKA と popularity が両方 1 なので count + 1
id2の東京は NIPPORI KURAMAE と popularity が両方 0 なので count + 0

id3の神奈川は YOKOSUKA は 0 で KAWASAKI が 1 なので count + 1
id4の神奈川は SAGAMI は 0 で YOKOHAMA が 1 なので count + 1

千葉はないので count 0

このことから下記のような結果が欲しいです。

CHIBA 0 KANAGAWA 2 TOKYO 1

すいませんが、どなたかご回答いただければ幸いです。
以上よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

やりかたはいろいろあると思いますが、個人的にはスカラサブクエリと集約関数(SUM)を組み合わせる方法がよいかと思います。

SQL

1SELECT 2 name, 3 SUM((SELECT LEAST(1, COUNT(*)) 4 FROM area_city AS B 5 WHERE A.id = B.area_id 6 AND B.popularit = 1)) 7FROM area_area AS A 8GROUP BY name;

投稿2021/06/09 10:45

neko_the_shadow

総合スコア2273

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

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

sususu

2021/06/09 10:54

ありがとうございます。上記を実行したところ「Unknown column 'name' in 'field list'」と出てきてしまいました。 ``` FROM area_city にし下記を実行いたしました。 SELECT name, SUM((SELECT LEAST(1, COUNT(*)) FROM area_city AS B WHERE A.id = B.area_id AND B.popularity = 1)) FROM area_city AS A GROUP BY name; ``` すると、下記のような結果となりました。 ``` AKASAKA 0 AOYAMA 1 KAWASAKI 0 KURAMAE 1 NIPPORI 1 SAGAMI 0 YOKOHAMA 0 YOKOSUKA 0 ``` 私の方が何か間違っていますでしょうか、ご教授いただければ幸いです。 よろしくお願いいたします。
neko_the_shadow

2021/06/09 12:08

area_areaテーブルのカラムは(id, name, explaine)と(id, perf, explaine)のどちらが正しいですか? (id, perf, explaine)が正しいのであればSQLは以下のようになります。 SELECT perf, SUM((SELECT LEAST(1, COUNT(*)) FROM area_city AS B WHERE A.id = B.area_id AND B.popularit = 1)) FROM area_area AS A GROUP BY perf;
sususu

2021/06/09 13:12

ありがとうございます。 ご提示いただいたコードで動きました! 焦って書き込んでしまい、カラム明を間違ってしまっておりました。 大変失礼いたしました、修正いたします。 ありがとうございました。
sususu

2021/06/10 01:57

neko_the_shqdow 様 先日はご回答いただきどうもありがとうございました。 立て続けで申し訳ありません。 上記の結果CHIBA 0 の行を結果から除外したいのですが、どのように書けばよろしいでしょうか。 試行錯誤しているのですが解決できていない状況です。 再度質問させていただいているので、ご回答いただければ幸いです。 https://teratail.com/questions/343231?modal=q-comp よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問