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

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

ただいまの
回答率

91.07%

  • MySQL

    4946questions

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

  • SQL

    1937questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 114

noob_noob

score 2

以下の条件に合うデータをユーザー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  UNION SELECT user_id AS ユーザーID, user_name AS ユーザー名  FROM `user_data`  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   AND   (SELECT SUM(hoge) FROM user_data WHERE rp_date = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)) > 0   GROUP BY user_id;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

前日の hoge が1以上で    
2日前から4日前の hoge が 0のときのデータ 

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

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

 追記

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

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

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

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

具体的にはこう

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


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

select user_id
from user_data
group by user_id
having sum((rp_date=curdate()-interval 1 day)*(hoge>=1))>0
and sum((rp_date=curdate()-interval 1 day)*(hoge<1))=0
and sum((rp_date between curdate()-interval 4 day and curdate()-interval 2 day)*(hoge=0))>0
and 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 09:56 編集

    すいません。質問がわかりにくかったです。

    前日の hoge が1以上「かつ」
    2日前から4日前の hoge が 0のときのデータ
    がほしいです。

    キャンセル

  • 2017/12/14 10: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
    のようなデータは条件と合致するのか提示が必要です

    キャンセル

  • 2017/12/14 10:52

    >user_idとrp_dateの組み合わせはユニークですか
    いえユニークではありません。複数持ちます。
    そのうえで全ての hoge が1以上でないといけません。

    >2日前から4日前のhoge一つで0を含む時なのか全てが0のときなのか
    定義が必要です。
    全てが0のときです。2日前=0、3日前データなし、4日前=0という条件も合致します。
    つまり 2日前から4日前の hoge が0又はデータなしの時になります。

    説明不足ですいません。
    よろしくお願いいたします

    キャンセル

  • 2017/12/14 10:58

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

    キャンセル

  • 2017/12/14 11:16

    1日前の hoge > 0 かつ 2~4日前のhoge=0(又はデータなし)
    のデータを取得したいということになります。

    1日前の条件と2~4日前の条件両方に合致するものがとりたいという意味です

    お答えになっているでしょうか。

    キャンセル

  • 2017/12/14 11:27

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

    キャンセル

  • 2017/12/14 11:34 編集

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

    キャンセル

  • 2017/12/14 14:13

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

    キャンセル

  • 2017/12/14 14:17

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

    キャンセル

0

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

SELECT user_id AS ユーザーID, user_name AS ユーザー名
FROM user_data as tgt
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)
       AND user_id=tgt.user_id) = 0 
AND (SELECT SUM(hoge) FROM user_data 
     WHERE rp_date = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)
       AND user_id=tgt.user_id) > 0 
     ) > 0 
GROUP BY user_id, user_name

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/14 10:09

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

    キャンセル

  • 2017/12/14 14:11

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

    キャンセル

  • 2017/12/14 14:16

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

    キャンセル

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

  • ただいまの回答率 91.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    4946questions

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

  • SQL

    1937questions

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