###実現したいこと
block、follow、favoriteというアクションが詰まったaction_datas
というテーブルがあるのですが、そこからユーザーリストを取得するときに、block関係にあるユーザーを除外するSQLを書きたいです。
###発生している問題
「➀followとfavoriteのユーザーリスト」を取得するSQLは別の機会で教えて頂いたものがあります。これは問題ありません。
そして「➁block関係にあるユーザーリスト」を取得するSQLもなんとか自分で書けました。
しかし、➀から➁を除外すべくnot in
でつなげると、何も取得されなくなってしまう状況です。
###検索対象となるテーブル(action_datas)
まず検索対象となるテーブルaction_datas
の作成コードになります。
SQL
1# action_datas の作成 2CREATE TABLE action_datas 3 (`action_id` int, `action_name` varchar(8), `action_date` varchar(4), `actor_id` int, `target_id` int, `target_type` varchar(6)) 4; 5INSERT INTO action_datas 6 (`action_id`, `action_name`, `action_date`, `actor_id`, `target_id`, `target_type`) 7VALUES 8 (1, 'block', '1月1日', 1, 2, 'user'), 9 (2, 'follow', '2月2日', 1, 20, 'thread'), 10 (3, 'follow', '3月3日', 2, 20, 'thread'), 11 (4, 'favorite', '4月4日', 3, 2, 'user'), 12 (5, 'follow', '5月5日', 3, 20, 'thread'), 13 (6, 'favorite', '6月6日', 1, 3, 'user'), 14 (7, 'block', '7月7日', 1, 4, 'user'), 15 (8, 'follow', '8月8日', 4, 20, 'thread'), 16 (9, 'block', '9月9日', 2, 1, 'user') 17;
###➀followとfavoriteのユーザーリスト
そして下記は「➀followとfavoriteのユーザーリスト」です。
(サイト閲覧者が1
で、閲覧中のスレッドが20
という設定なので、actor_id=1
でtarget_id=20
となっています。)
ここからblock関係のユーザーの除外を実現したいので、コメントアウトしてる部分を実装できればと思っています。
SQL
1 select follow.actor_id 2 , max( 3 case when action.action_name='follow' then action.action_date end 4 ) as follow_date 5 , max( 6 case when action.action_name='favorite' then action.action_date end 7 ) as favorite_date 8 from action_datas follow 9 left join action_datas action 10 on follow.actor_id=action.target_id 11 and action.actor_id=1 and action.target_type='user' 12 where follow.target_type='thread' and follow.target_id=20 13 14 /* 15 # 1とblock関係にあるユーザーを除外 16 not in( 17 18 ) 19 */ 20 21 group by follow.actor_id
###➁block関係にあるユーザーリスト
続いて自分で書いたものなのでおかしな点があるかもしれませんが、「➁block関係にあるユーザーリスト」が下記になります。
一応、先のテーブルaction_datas
から、1
をblockしている2
と、1
がblockしている4
が取得できる状況です。
SQL
1 # 1をblockしているユーザーを取得 2 select block.actor_id 3 from action_datas block 4 where block.target_type='user' and block.target_id=1 and action_name='block' 5 group by block.actor_id 6 # 1がblockしているユーザーをunionする 7 union 8 select target_id 9 from action_datas 10 where action_name='block' and actor_id=1
###試したこと
「➀followとfavoriteのユーザーリスト」のコメントアウトしてる部分に「➁block関係にあるユーザーリスト」を記載すると、何も取得できなくなってしまいました。
こちらのSQL fiddleで試していただけます。
そしてnull
がある場合に取得できなくなるという例を見つけまして、「➀followとfavoriteのユーザーリスト」にはnull
が入るからそれが原因かと思いis not null
を加えてみたのですがやはり何も取得できず、先に進めなくなってしまいました。
ご助力願えましたら幸甚に存じます。
どうぞ宜しくお願い致します。
###補足情報(FW/ツールのバージョンなど)
phpMyAdmin(4.8.5)で、MySQL(10.0.33-MariaDB)を使っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/02 15:57 編集
2020/02/02 15:49
2020/02/02 16:10
2020/02/03 07:25 編集
2020/02/02 17:34