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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

Q&A

解決済

3回答

1005閲覧

MySQLにて2つのSelect文の結果を横に結合したい

komet

総合スコア13

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

0グッド

0クリップ

投稿2020/02/25 15:39

いま質問投稿機能を作っているのですが、2つのSelect文の結果を横に結合したいです。
まず下のようなテーブルがあり、
mysql> select * from questionReaction;
+------------+--------+------------+----------+
| reactionID | userID | questionID | reaction |
+------------+--------+------------+----------+
| 7 | 1 | 1 | 0 |
| 8 | 2 | 1 | 0 |
| 9 | 3 | 1 | 1 |
| 10 | 4 | 1 | 0 |
| 11 | 5 | 1 | 0 |
| 12 | 6 | 1 | 1 |
| 13 | 7 | 1 | 0 |
| 15 | 1 | 2 | 1 |
| 16 | 2 | 2 | 1 |
| 17 | 3 | 2 | 1 |
| 18 | 4 | 2 | 0 |
| 19 | 5 | 2 | 1 |
| 20 | 6 | 2 | 0 |
| 21 | 7 | 2 | 0 |
| 22 | 1 | 3 | 0 |
| 23 | 2 | 3 | 1 |
| 24 | 3 | 3 | 0 |
| 25 | 4 | 3 | 0 |
| 26 | 5 | 3 | 1 |
| 27 | 6 | 3 | 0 |
| 28 | 7 | 3 | 1 |
+------------+--------+------------+----------+

reactionが0のみのデータが
mysql> select questions.questionID, count(questions.questionID) as goodCount from questionReaction inner join questions on questionReaction.questionID = questions.questionID where questionReaction.reaction = 0 group by questions.questionID;
+------------+-----------+
| questionID | goodCount |
+------------+-----------+
| 1 | 5 |
| 2 | 3 |
| 3 | 4 |
+------------+-----------+
reactionが1のデータが
mysql> select questions.questionID, count(questions.questionID) as badCount from questionReaction inner join questions on questionReaction.questionID = questions.questionID where questionReaction.reaction = 1 group by questions.questionID;
+------------+----------+
| questionID | badCount |
+------------+----------+
| 1 | 2 |
| 2 | 4 |
| 3 | 3 |
+------------+----------+
で得られるのですが、この結果を
+------------+-----------+----------+
| questionID | goodCount | badCount |
+------------+-----------+----------+
| 1 | 5 | 2|
| 2 | 3 | 4|
| 3 | 4 | 3|
+------------+-----------+----------+
のように表示したいです。二つの結果をunionを用いると縦に並んでしまったのでやり方が分かりませんでした。

あともしできればgoodCountがbadCountより大きい項目のみを以下のようにする
+------------+-----------+----------+
| questionID | goodCount | badCount |
+------------+-----------+----------+
| 1 | 5 | 2|
| 3 | 4 | 3|
+------------+-----------+----------+
SQLも教えていただきたいです。よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

評価式の(true/false)=(1/0)を利用して、sum()で集計する方法もあります。

SQL

1select questionID 2 , sum(reaction=0) as goodCount 3 , sum(reaction=1) as badCount 4from questionReaction 5group by questionID 6having goodCount > badCount

投稿2020/02/25 18:05

sazi

総合スコア25195

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

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

0

countを使ったケース

sql

1select questions.questionID, 2 count(reaction=0 or null) as goodCount, 3 count(reaction=1 or null) as badCount 4from questionReaction inner join questions on 5 questionReaction.questionID=questions.questionID 6group by questions.questionID having(goodCount>badCount) 7;

投稿2020/02/26 03:12

amura

総合スコア333

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

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

sazi

2020/02/26 03:21

count()は値があるか無いかですので、それだと条件に依らず全てカウントされると思います。
amura

2020/02/26 03:41 編集

NULLはカウントしない様です mysqlだけと思いきやpostgresでもできました。
sazi

2020/02/26 04:07

Nullはカウントしませんが、評価式はTrue/FalseですのでNullにはなりませんよ? (reaction=0 or null)はどういった意図なのか分かりませんが。 ※(reaction=0 or reaction is null)としたかった?
amura

2020/02/26 04:13

(reaction=0 or null) は (case when reaction=0 then true else null end) と同じ様な動きをしている様です。いままでcount,sumの時、caseで書いておりましたが、こんな書き方でも良いらしいです。
sazi

2020/02/26 07:04 編集

postgresで確認しましたが、以下の様になりました。 (true or null)=true, (false or Null)=Null, (true and null)=Null, (false and Null)=false 面白いなとは思いましたが、初見の人には意図が絶対分からないと思いますので、敢えてcount()を使用するメリットは無さそうですね。sum()の方が記述も簡潔ですし。
amura

2020/02/26 22:23 編集

ごもっともです。CASEが得意でないので、今回ELSE無しでOKとわかりました。 古いプログラマなので、(false or false or false or null)の様に booleanで並べられる面白いです。
guest

0

カウントしたいだけならcount()の部分でCASE文使うのが良いと思います。

sql

1CREATE TABLE questionReaction(reactionID int, userID int, questionID int, reaction tinyint); 2Query OK, 0 rows affected (0.116 sec) 3 4 5INSERT INTO questionReaction(reactionID, userID, questionID, reaction) 6VALUES 7 ( 7 , 1 , 1 , 0 ), 8 ( 8 , 2 , 1 , 0 ), 9 ( 9 , 3 , 1 , 1 ), 10 (10 , 4 , 1 , 0 ), 11 (11 , 5 , 1 , 0 ), 12 (12 , 6 , 1 , 1 ), 13 (13 , 7 , 1 , 0 ), 14 (15 , 1 , 2 , 1 ), 15 (16 , 2 , 2 , 1 ), 16 (17 , 3 , 2 , 1 ), 17 (18 , 4 , 2 , 0 ), 18 (19 , 5 , 2 , 1 ), 19 (20 , 6 , 2 , 0 ), 20 (21 , 7 , 2 , 0 ), 21 (22 , 1 , 3 , 0 ), 22 (23 , 2 , 3 , 1 ), 23 (24 , 3 , 3 , 0 ), 24 (25 , 4 , 3 , 0 ), 25 (26 , 5 , 3 , 1 ), 26 (27 , 6 , 3 , 0 ), 27 (28 , 7 , 3 , 1 ); 28Query OK, 21 rows affected (0.089 sec) 29 30 31SELECT 32 questionID, 33 count(CASE WHEN reaction = 0 THEN questionID END) as goodCount, 34 count(CASE WHEN reaction = 1 THEN questionID END) as badCount 35FROM 36 questionReaction 37GROUP BY 38 questionID; 39+------------+-----------+----------+ 40| questionID | goodCount | badCount | 41+------------+-----------+----------+ 42| 1 | 5 | 2 | 43| 2 | 3 | 4 | 44| 3 | 4 | 3 | 45+------------+-----------+----------+ 46 47 48SELECT 49 questionID, 50 count(CASE WHEN reaction = 0 THEN questionID END) as goodCount, 51 count(CASE WHEN reaction = 1 THEN questionID END) as badCount 52FROM 53 questionReaction 54GROUP BY 55 questionID 56HAVING goodCount > badCount; 57+------------+-----------+----------+ 58| questionID | goodCount | badCount | 59+------------+-----------+----------+ 60| 1 | 5 | 2 | 61| 3 | 4 | 3 | 62+------------+-----------+----------+ 63

投稿2020/02/25 17:17

Eggpan

総合スコア2727

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問