プロが教えるわが家の防犯対策術!

「phpとmysqlでDBにある前日と1ヶ月前の差分を計算したい」という質問の続きになってしまうのですが、前日のデータ(前月のデータ)がないメンバーは表示しないようにしたいのですが可能でしょうか?

前回の質問
https://oshiete.goo.ne.jp/qa/10954721.html

具体的には教えていただいた下記sqlのメンバー106(11番=1/25に初めてデータ登録された人)は前日のデータがないのでselectで抽出したときに表示させないようにしたいのです。

create table tbl(id int primary key, member_id int, follower_count int, d date,unique key(member_id,d));
insert into tbl values
(1, 101, 55, '2019-01-24'),
(2, 102, 123, '2019-01-24'),
(3, 103, 10, '2019-01-24'),
(4, 104, 5, '2019-01-24'),
(5, 105, 88, '2019-01-24'),
(6, 101, 70, '2019-01-25'),
(7, 102, 80, '2019-01-25'),
(8, 103, 50, '2019-01-25'),
(9, 104, 150, '2019-01-25'),
(10, 105, 55, '2019-01-25'),
(11, 106, 1, '2019-01-25'),
(12, 101, 1, '2019-01-23');

11番=1/25に初めてデータ登録された人
12番=もっと古いデータ

select
t1.id
,t1.member_id
,t1.follower_count-coalesce(t2.follower_count,0) as zougen
from tbl as t1
left join tbl as t2 on t1.member_id=t2.member_id
and t2.d='2019-01-24'
where t1.d='2019-01-25'
order by zougen desc

sql側でできない場合は、php側で処理するしかないでしょうか?

A 回答 (3件)

なるほど


tblをleft joinからinner joinにするだけでいけるかも

select
t1.id
,t1.member_id
,t3.name
,t1.follower_count-t2.follower_count as zougen
from tbl as t1
inner join tbl as t2 on t1.member_id=t2.member_id
and t2.d='2019-01-24'
inner join member as t3
on t1.member_id=t3.member_id
where t1.d='2019-01-25'
order by zougen desc
    • good
    • 0
この回答へのお礼

ありがとうございます!できました!
いつも助かります。

お礼日時:2019/02/05 18:35

んー、ちょっと状況がわかりません



select
t1.id
,t1.member_id
,t3.name
,t1.follower_count-t2.follower_count as zougen
from tbl as t1
left join tbl as t2 on t1.member_id=t2.member_id
and t2.d='2019-01-24'
inner join member as t3
on t1.member_id=t3.member_id
where t1.d='2019-01-25'
order by zougen desc

で、106のユーザーは表示されませんよね?
表示されないのが正解なら問題ないような・・・・
    • good
    • 0
この回答へのお礼

言葉足らずで申し訳ありません。

上記を実行してみると

id, member_id, name,zougen
9 104 太田智 145
8 103 宇野次郎 40
6 101 安倍里美 15
10 105 佐藤将弘 -33
7 102 五十嵐太郎 -43
11 106 加藤博也 NULL

このように表示されまして、zougenがNULLで表示されました。

この「106 加藤博也 NULL」自体を表示させないようにすることは可能でしょうか?

お礼日時:2019/02/04 18:51

> 前日のデータがないのでselectで抽出したときに表示させないようにしたい



> php側で処理するしかないでしょうか?

いや、むしろこちらの方がラクです

select
t1.id
,t1.member_id
,t1.follower_count-t2.follower_count as zougen
from tbl as t1
inner join tbl as t2 on t1.member_id=t2.member_id
and t2.d='2019-01-24'
where t1.d='2019-01-25'
order by zougen desc
    • good
    • 0
この回答へのお礼

yambejpさん、いつもありがとうございます!

私のミスで最初からこちらで出しておけばよかったのですが

select
t1.id
,t1.member_id
,t3.name
,t1.follower_count-t2.follower_count as zougen
from tbl as t1
left join tbl as t2 on t1.member_id=t2.member_id
and t2.d='2019-01-24'
inner join member as t3
on t1.member_id=t3.member_id
where t1.d='2019-01-25'
order by zougen desc

memberテーブルもjoinしたこちらのsqlで試すと、zougenは空ですがメンバー106も抽出される・・・で合っていますか?

php側でzougenが空の人は表示させないようにして思っていた通りに表示できたのですが、
もしかしてsql側でメンバー106の人を抽出させないことができるのかなと思い、また質問させていただきました。

何度も申し訳ございません。
よろしくお願い致します。

お礼日時:2019/02/04 17:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!