###実現したいこと
該当のテーブルaction_table
から、
➀user_id=1
が実行したfavorite
を取得する。
➁favorite_date
を入れる。
➂follow_date
を入れる。
という風に取得したいです。
###発生している問題
➀と➁はできましたが、➂ができません。
###該当のテーブル
以下action_table
になります。
SQL
1CREATE TABLE action_table 2 (`action_id` int, `action_name` text, `action_date` text, `actor_id` int, `target_id` int, `target_type` text) 3; 4INSERT INTO action_table 5 (`action_id`, `action_name`, `action_date`, `actor_id`, `target_id`, `target_type`) 6VALUES 7 (1, 'follow', '2020-01-01 01:01:01', 1, 3, 'user'), 8 (2, 'favorite', '2020-02-02 02:02:02', 1, 4, 'user'), 9 (3, 'favorite', '2020-03-03 03:03:03', 1, 3, 'user'), 10 (4, 'block', '2020-04-04 04:04:04', 4, 1, 'user'), 11 (5, 'follow', '2020-05-05 05:05:05', 1, 2, 'user'), 12 (6, 'favorite', '2020-06-06 06:06:06', 1, 5, 'user') 13;
###現状のソースコード
問題が発生するソースコードです。
実行していただくとfollow_date
がnull
になってしまっていると思います。
SQL
1 select favorite.target_id 2 , case when 3 favorite.action_name='follow' 4 then favorite.action_date else null end 5 as follow_date 6 , case when 7 favorite.action_name='favorite' 8 then favorite.action_date else null end 9 as favorite_date 10 11 from action_table favorite 12 13 where favorite.actor_id=1 and favorite.action_name='favorite' 14 15 group by favorite.target_id
###試したこと
favorite
だけに限定せず、そしてgroup by
をやめるという下記2つの変更を試みました。
必要なレコードがそろっていることが確認できました。
これをうまくgroup by
すればよさそうに思えます。
SQL
1 where favorite.actor_id=1 and favorite.action_name='favorite' 2 ↓ 変更 3 where favorite.actor_id=1
SQL
1 group by favorite.target_id 2 ↓ 変更 3 # group by favorite.target_id
これら必要なレコードからnull
のものを除外してみたらどうかと思い下記のようにcount()
を使ったのですが、
なぜか取得できたのは「3だけ」となってしまいました。(count()
をmax()
にしても同じでした)
「1」がfavorite
しているのは「3だけ」でなく「4・3・5」なのでそのレコードを取得したいのですが。
SQL
1 select favorite.target_id 2 , case when 3 favorite.action_name='follow' 4 then favorite.action_date else null end 5 as follow_date 6 , case when 7 favorite.action_name='favorite' 8 then favorite.action_date else null end 9 as favorite_date 10 11 ↓ count()を使うように変更 12 13 select favorite.target_id 14 , count( case when 15 favorite.action_name='follow' 16 then favorite.action_date else null end 17 ) as follow_date 18 , count( case when 19 favorite.action_name='favorite' 20 then favorite.action_date else null end 21 ) as favorite_date
###補足情報(FW/ツールのバージョンなど)
phpMyAdmin(4.8.5)で、MySQL(10.0.33-MariaDB)を使っています。
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー