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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

274閲覧

MySQLでの二つのSELECT文の結合

trafalbad

総合スコア303

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2018/01/14 14:37

編集2018/01/14 14:39

次の二つのSELECT文を横に結合して4列で出力したいと考えいます。

SQL

1#1.mahouseki_logで0以上の値をもつuser_idに合致する3月中のlogin_logのuser_idからCOUNT(user_id), user_idを出力 2 3SELECT COUNT(user_id), user_id 4FROM login_log 5WHERE timestamp LIKE '3%' 6GROUP BY user_id 7HAVING user_id IN(SELECT user_id 8 FROM mahoseki_log 9 WHERE price_yen>=0 AND timestamp LIKE '3%'); 10 11.mahouseki_logで0以上の値をもつuser_idに合致する3月中のlogin_logのuser_idから下記のSELECT文以降の2つを出力 12SELECT COUNT(DISTINCT DATE_FORMAT(STR_TO_DATE(`timestamp`, '%c/%e/%y %H:%i'), '%d')) AS day, 13COUNT(quest_id) 14FROM quest_log 15WHERE timestamp LIKE '3%' 16GROUP BY user_id 17HAVING user_id IN(SELECT user_id 18 FROM mahoseki_log 19 WHERE price_yen>=0 AND timestamp LIKE '3%');

個人的にUNIONで結合しても列がそれぞれ2つあるためうまく行きません。また内部結合を試して見たのですが、細かいところ、および出力結果が違ってしまいました。

この二つのSELECT文を結合して4つの出力結果を得るにはどのような方法があるのかご教授いただけないでしょうか?よろしくお願いします、

またデータベースは下記のように挿入して作成しました

SQL

1CREATE TABLE user_master 2(user_id INTEGER, 3 install_datetime CHAR(13), 4 delete_flg INTEGER); 5 6INSERT INTO user_master VALUES (10001, '3/19/16 15:45', 0), 7 (10002, '3/21/16 12:30', 1), 8 (10003, '3/23/16 9:15', 0), 9 (10004, '3/25/16 6:00', 0), 10 (10005, '3/19/16 15:45', 1); 11 12 13CREATE TABLE login_log 14(user_id INTEGER, 15 timestamp CHAR(18)); 16 17INSERT INTO login_log VALUES (10001, '3/19/16 15:50'), 18 (10001, '3/20/16 0:20'), 19 (10001, '3/23/16 14:10'), 20 (10001, '3/24/16 0:15'), 21 (10002, '3/21/16 12:50'), 22 (10003, '3/23/16 11:00'), 23 (10003, '3/24/16 9:10'), 24 (10003, '3/24/16 11:20'); 25 26CREATE TABLE mahoseki_log 27(user_id INTEGER, 28 timestamp CHAR(13), 29 amount INTEGER, 30 category CHAR(7), 31 price_yen INTEGER); 32 33INSERT INTO mahoseki_log VALUES (10001, '3/19/16 15:50', 8, 'present', NULL), 34 (10001, '3/19/16 16:02', 1, 'presen', NULL), 35 (10001, '3/23/16 14:21', -5, 'gacha', NULL), 36 (10001, '3/23/16 14:30', -1, 'stamina', NULL), 37 (10002, '3/21/16 12:50', 8, 'present', NULL), 38 (10002, '3/21/16 12:55', -5, 'gacha', NULL), 39 (10003, '3/23/16 11:00', 8, 'present', NULL), 40 (10003, '3/23/16 11:10', 1, 'present', NULL), 41 (10003, '3/23/16 11:22', 1, 'present', NULL), 42 (10003, '3/23/16 11:30', 90, 'buy', 5400), 43 (10003, '3/23/16 11:32', -50, 'gacha', NULL), 44 (10003, '3/23/16 11:36', -50, 'gacha', NULL); 45 46 47 CREATE TABLE quest_log 48(user_id INTEGER, 49 timestamp CHAR(13), 50 quest_id INTEGER, 51 result INTEGER); 52 53INSERT INTO quest_log VALUES (10001, '3/19/16 15:55', 1001, 1), 54 (10001, '3/19/16 15:57', 1002, 1), 55 (10001, '3/19/16 16:00', 1003, 0), 56 (10001, '3/19/16 16:02', 1003, 1), 57 (10001, '3/19/16 16:07', 2001, 1), 58 (10001, '3/23/16 14:20', 1000101, 0), 59 (10001, '3/23/16 14:28', 1000101, 0), 60 (10001, '3/23/16 14:31', 1000101, 1), 61 (10003, '3/23/16 11:05', 1001, 1), 62 (10003, '3/23/16 11:07', 1002, 1), 63 (10003, '3/23/16 11:10', 1003, 1), 64 (10003, '3/23/16 11:15', 2001, 1), 65 (10003, '3/23/16 11:19', 2002, 1), 66 (10003, '3/23/16 11:22', 2003, 1), 67 (10003, '3/23/16 11:30', 3001, 1); 68 69

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

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

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

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

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

guest

回答2

0

ベストアンサー

関連性のないデータがそれぞれ1行しか無く
それを横につなげるならunionして(数値の場合)sum
※文字列の場合はnullとgroup_concatする

SQL

1select 2sum(count_user_id) as count_user_id, 3sum(user_id) as user_id, 4sum(day) as day, 5sum(quest_id) as quest_id from ( 6select count(user_id) as count_user_id, user_id,0 as day,0 quest_id 7from login_log 8where timestamp like '3%' 9group by user_id 10having user_id in( 11select user_id 12from mahoseki_log 13where price_yen>=0 and timestamp like '3%' 14) 15union all select 0,0,count(distinct date_format(str_to_date(`timestamp`, '%c/%e/%y %H:%i'), '%d')) as day, 16count(quest_id) 17from quest_log 18where timestamp like '3%' 19group by user_id 20having user_id in( 21select user_id 22from mahoseki_log 23where price_yen>=0 and timestamp like '3%') 24) as sub

投稿2018/01/15 00:33

yambejp

総合スコア114585

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

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

trafalbad

2018/01/15 02:29

解決しましたありがとうございます
guest

0

with句で2つのselect文を定義しておいて、
完全外部結合すればいいです。

完全外部結合はMySQL8.0でサポートされてないので、
代用する必要がありますが

投稿2018/01/14 23:27

koretou

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問