mysql
1create table mydb.login_log (user_id integer, timestamp timestamp); 2create table mydb.charge_log (user_id integer, timestamp timestamp, category char(10)); 3create table mydb.quest_log (user_id integer, timestamp timestamp, quest_id integer); 4 5LOAD DATA LOCAL INFILE 'C:/Windows/Temp/login_log.csv' INTO TABLE mydb.login_log 6 FIELDS 7 TERMINATED BY ',' 8 ENCLOSED BY '"' 9 LINES TERMINATED BY '\r\n'; 10 11LOAD DATA LOCAL INFILE 'C:/Windows/Temp/charge_log.csv' INTO TABLE mydb.charge_log 12 FIELDS 13 TERMINATED BY ',' 14 ENCLOSED BY '"' 15 LINES TERMINATED BY '\r\n'; 16 17LOAD DATA LOCAL INFILE 'C:/Windows/Temp/quest_log.csv' INTO TABLE mydb.quest_log 18 FIELDS 19 TERMINATED BY ',' 20 ENCLOSED BY '"' 21 LINES TERMINATED BY '\r\n'; 22 23```### 前提・実現したいこと 24sqlで、複数の条件に合致したデータを抽出したい。 25 26具体的には、 27ログインの履歴を持つデータ(login_log)と 28課金の履歴を持つデータ(charge_log)と 29クエストの履歴を持つデータ(quest_log)を用いて 301月に課金(charge_logのcategoryがbuy)したユーザーについて、 31ユーザーごとに、 32ユーザーID・2月のログイン回数・2月にクエストを行った日数・2月にクエストを行った回数を出力したい。 33 34(ex) 35login_log 36user_id | timestamp 37001 |2020-01-01 12:10:00 38001 |2020-01-18 19:15:00 39002 |2020-01-17 09:40:00 40... 41 42charge_log 43user_id | timestamp |category 44001 |2020-01-01 12:10:00 |buy 45002 |2020-01-17 09:40:00 |present 46... 47 48quest_log 49user_id | timestamp |quest_id 50001 |2020-01-01 12:15:00 |10001 51002 |2020-01-17 09:47:00 |10002 52... 53 54 55### 発生している問題 56出力したログイン回数、クエストを行った日数、クエストを行った回数の数値が誤っている。 57 58### 該当のソースコード 59SELECT 60 t1.user_id AS 'ユーザーID' 61 ,COUNT(t2.user_id) AS '2月のログイン回数' 62 ,COUNT(DATE(t3.timestamp)) AS '2月でクエストを行った日数' 63 ,COUNT(t3.quest_id) AS '2月でクエストを行った回数' 64FROM charge_log t1 65 LEFT JOIN login_log t2 66 ON 67 t1.user_id = t2.user_id 68 AND 69 MONTH(t2.timestamp) = 2 70 LEFT JOIN quest_log t3 71 ON 72 t1.user_id = t3.user_id 73 AND 74 MONTH(t3.timestamp) = 2 75WHERE 76 t1.category = 'buy' 77AND 78 MONTH(t1.timestamp) = 1 79GROUP BY 80 t1.user_id 81; 82 83### 試したこと 84一旦ログイン回数だけを出力するsqlを考えて実行したところ、正しい数値を出力することができたが 85全体のsqlに組み込む方法がわからない。 86 87実行したsql: 88select 89t1.user_id 90,count(t1.user_id) as '2月のログイン回数' 91from login_log t1 92left join charge_log t2 93on t1.user_id = t2.user_id 94where month(t1.timestamp) = 2 95and 96 t2.category = 'buy' 97and 98 month(t2.timestamp) = 1 99group by 100 t1.user_id 101;
質問のテーブル定義とデータは CREATE TABLE文とINSERT文で、SELECT文も含めて https://teratail.com/help/question-tips#questionTips3-7 の [コード] で提示できると動作確認し易いので、適切なコメントが付き易いです。
お教えいただきありがとうございます。
今回使用しているデータが外部から提供されたデータであり、公開するのに抵抗があるため、類似のデータとして例を記載しております。
それだと回答しにくいかとは思うのですが、記載できず申し訳ございません。
質問を修正してください。
SELECT文が書いてあるからデータはテーブルに入っているのはわかっているから、CSVの話は全部削りましょう。
charge_log, login_log , quest_log のテーブルの説明をCREATE TABLE文とINSERT文に直してください。
ログイン, 課金, クエストはそれぞれで独立(ログインだけとか課金だけとかがある)していますか?
修正しました。
修正対応をすることが初めてなので、対応方法等誤っていたらお教えいただけると幸いです。
お手数をお掛けしますが、何卒宜しくお願いいたします。
完全に独立はしていないです。
ログインをした後に、複数回課金やクエストが行われることはありますが、
ログインを一度もせずに課金やクエストが行われることはありません。
課金とクエストの間には関係性はありません。
sazi さんにお任せします。疲れました。
回答1件
あなたの回答
tips
プレビュー