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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1734閲覧

条件に合致したデータをうまくとりたい

noob_noob

総合スコア6

MySQL

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

SQL

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

0グッド

0クリップ

投稿2017/12/13 12:57

###以下の条件に合うデータをユーザーIDでグループ化して取りたい
前日の hoge が1以上で
2日前から4日前の hoge が 0のときのデータ

テーブル名
user_data

SELECTするカラム
ユーザーID
ユーザー名

テーブルのカラム構成は以下

rp_date date NOT NULL,
user_id int(10) UNSIGNED NOT NULL,
user_name varchar(1024) NOT NULL,
hoge int(11) NOT NULL,

カラム名などは適当です

必要なカラムだけ書いてます

rp_dateに日付が入ってます

よろしくお願いします。

###発生している問題

hoge が0のときデータがうまく取れない

###該当のソースコード

sql

1 UNION SELECT user_id AS ユーザーID, user_name AS ユーザー名 2 FROM `user_data` 3 WHERE (SELECT SUM(hoge) FROM user_data WHERE rp_date <= DATE_SUB(CURRENT_DATE(),INTERVAL 4 DAY) AND rp_date >= DATE_SUB(CURRENT_DATE(),INTERVAL 2 DAY)) = 0 4 AND 5 (SELECT SUM(hoge) FROM user_data WHERE rp_date = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)) > 0 6 GROUP BY user_id;```

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

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

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

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

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

guest

回答2

0

user_idの条件が無く相関問い合わせになっていないからだと思います。

SQL

1SELECT user_id AS ユーザーID, user_name AS ユーザー名 2FROM user_data as tgt 3WHERE 4 (SELECT SUM(hoge) FROM user_data 5 WHERE rp_date <= DATE_SUB(CURRENT_DATE(),INTERVAL 4 DAY) 6 AND rp_date >= DATE_SUB(CURRENT_DATE(),INTERVAL 2 DAY) 7 AND user_id=tgt.user_id) = 0 8AND (SELECT SUM(hoge) FROM user_data 9 WHERE rp_date = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY) 10 AND user_id=tgt.user_id) > 0 11 ) > 0 12GROUP BY user_id, user_name

投稿2017/12/14 00:59

sazi

総合スコア25173

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

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

noob_noob

2017/12/14 01:09

なるほど。ありがとうございます。試してみます。
noob_noob

2017/12/14 05:11

すいません。上手くとることができませんでした。
sazi

2017/12/14 05:16

元々のSQLに相関問い合わせになるように条件を追加しただけなので、 どのように上手くいっていないかをコメントもらえるとアドバイスできるかもしれません。
guest

0

前日の hoge が1以上で

2日前から4日前の hoge が 0のときのデータ

前日の hoge が1以上「か」
2日前から4日前の hoge が 0のときのデータ
でよろしいでしょうか?

SQL

1select * from user_data where 0 2or (rp_date = curdate() - interval 1 day and hoge=1) 3or (rp_date between curdate() - interval 4 day and curdate() - interval 2 day 4and hoge=0) ; 5

追記

※以下修正します。1ではなく1以上でした

質問者さんから提示された追加仕様を元に、判断基準を4つ用意しました
(1)1日前でhoge>=1のデータが最低1つ必要
(2)1日前でhoge<1のデータは存在してはいけない
(3)24日前でhoge=0のデータが最低1つ必要
(4)2
4日前でhoge=0以外のデータは存在してはいけない

その上で本日を'2017-12-14'として計算します

SQL

1create table user_data (id int primary key,rp_date date,user_id int,hoge int); 2insert into user_data values 3(1,'2017-12-13',1,0), 4(2,'2017-12-13',1,1), 5(3,'2017-12-13',2,1), 6(4,'2017-12-12',2,0), 7(5,'2017-12-12',2,0), 8(6,'2017-12-12',2,1), 9(7,'2017-12-13',3,1), 10(8,'2017-12-13',3,1), 11(9,'2017-12-12',3,0), 12(10,'2017-12-12',3,0), 13(11,'2017-12-12',3,0), 14(12,'2017-12-11',3,0), 15(13,'2017-12-10',3,0);
  • user_id=1は条件2と条件3違反
  • user_id=2は条件4違反
  • user_id=3は全ての条件をクリア

具体的にはこう

SQL

1select user_id 2,sum((rp_date=curdate()-interval 1 day)*(hoge>=1)) as j1 3,sum((rp_date=curdate()-interval 1 day)*(hoge<1)) as j2 4,sum((rp_date between curdate()-interval 4 day and curdate()-interval 2 day)*(hoge=0)) as j3 5,sum((rp_date between curdate()-interval 4 day and curdate()-interval 2 day)*(hoge!=0)) as j4 6from user_data 7group by user_id

これを元にuser_idのみ抽出するのでhavingでまとめます

SQL

1select user_id 2from user_data 3group by user_id 4having sum((rp_date=curdate()-interval 1 day)*(hoge>=1))>0 5and sum((rp_date=curdate()-interval 1 day)*(hoge<1))=0 6and sum((rp_date between curdate()-interval 4 day and curdate()-interval 2 day)*(hoge=0))>0 7and sum((rp_date between curdate()-interval 4 day and curdate()-interval 2 day)*(hoge!=0))=0;

上記本日が'2017-12-14'でない場合は「curdate()」の部分を「'2017-12-14'」に書き換えてください

投稿2017/12/14 00:42

編集2017/12/14 02:25
yambejp

総合スコア114767

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

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

noob_noob

2017/12/14 00:56 編集

すいません。質問がわかりにくかったです。 前日の hoge が1以上「かつ」 2日前から4日前の hoge が 0のときのデータ がほしいです。
yambejp

2017/12/14 01:19

user_idとrp_dateの組み合わせはユニークですか つまり今日が2017-12-14だとして user_id=1のユーザーがrp_date=2017-12-13となるデータを 複数持つのか?ということです、その上で > 前日の hoge が1 とは、複数持つデータの1つが1ならいいのか、全てが1でなくてはならないのか仕様をきめてください。また、どうように > 2日前から4日前の hoge が 0のとき これは2日前から4日前のhoge一つで0を含む時なのか全てが0のときなのか 定義が必要です。また全てが0である必要あるとき 2日前=0、3日前データなし、4日前=0 のようなデータは条件と合致するのか提示が必要です
noob_noob

2017/12/14 01:52

>user_idとrp_dateの組み合わせはユニークですか いえユニークではありません。複数持ちます。 そのうえで全ての hoge が1以上でないといけません。 >2日前から4日前のhoge一つで0を含む時なのか全てが0のときなのか 定義が必要です。 全てが0のときです。2日前=0、3日前データなし、4日前=0という条件も合致します。 つまり 2日前から4日前の hoge が0又はデータなしの時になります。 説明不足ですいません。 よろしくお願いいたします
yambejp

2017/12/14 01:58

もう1つだけ、1日前のhoge=1および2~4日前のhoge=0は 各最低でも1つは必要というでいいですよね?
noob_noob

2017/12/14 02:16

1日前の hoge > 0 かつ 2~4日前のhoge=0(又はデータなし) のデータを取得したいということになります。 1日前の条件と2~4日前の条件両方に合致するものがとりたいという意味です お答えになっているでしょうか。
yambejp

2017/12/14 02:27

サンプルを追記しておきました ちなみにuser_nameは正規化して別テーブルで管理するものとし 省略してあります
noob_noob

2017/12/14 02:34 編集

ありがとうございます!とても参考になりました!
noob_noob

2017/12/14 05:13

すいません。やりたいことと若干ずれていました。
yambejp

2017/12/14 05:17

そうですか、お役に立てなくて残念です 仕様が固まったらサンプルをつけて再提示されるとよろしいかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問