###実現したいこと
「スレッドへのコメントリスト」と「お気に入りリスト」を連結したいです。
コメントへは添付データがありうるので、「コメントへの添付データをお気に入りしているかどうか」も、コメントと一緒に表示したいためです。
それぞれ別々のSELECT
はできており、あとは連結だけなので簡単かと思ったのですが躓いてしまいました。
以下とても長い内容になってしまいましたが、ご覧いただけましたら幸いでございます。
###対象のテーブル
後述するすべてのSQL fiddleのテーブルのCREATE TABLE
を念のため掲載いたします。(SQL fiddleにあるものと同じなのでご覧いただかなくとも結構です。)
SQL
1# jp_actions 2# アクションのテーブル 3CREATE TABLE jp_actions 4 (action_id int, action_name text, action_date text, actor_id int, target_id int, target_type text, target_country_code text) 5; 6INSERT INTO jp_actions 7 (action_id, action_name, action_date, actor_id, target_id, target_type, target_country_code) 8VALUES 9 (1, 'follow', '2020-01-01 01:00:00', 1, 3, 'user', 'jp'), 10 (2, 'favorite', '2020-02-02 02:00:00', 1, 4, 'drama', 'zh'), 11 (3, 'favorite', '2020-03-03 03:00:00', 1, 3, 'user', 'jp'), 12 (4, 'favorite', '2020-04-04 04:00:00', 2, 5, 'user', 'jp'), 13 (5, 'favorite', '2020-05-05 05:00:00', 1, 7, 'user', 'jp'), 14 (6, 'follow', '2020-06-06 06:00:00', 1, 2, 'user', 'jp'), 15 (7, 'follow', '2020-07-07 07:00:00', 1, 7, 'user', 'jp'), 16 (8, 'block', '2020-08-08 08:00:00', 1, 5, 'user', 'jp'), 17 (9, 'favorite', '2020-09-09 09:00:00', 1, 5, 'user', 'jp'), 18 (10, 'favorite', '2020-10-10 10:00:00', 1, 5, 'movie', 'en'), 19 (11, 'favorite', '2020-11-11 11:00:00', 1, 3, 'user', 'en'), 20 (12, 'favorite', '2020-12-12 12:00:00', 1, 3, 'thread','jp') 21; 22 23# country_contents 24# コンテンツのテーブル 25CREATE TABLE country_contents 26 (content_id int, content_type text, country_code text, content_title text) 27; 28INSERT INTO country_contents 29 (content_id, content_type, country_code, content_title) 30VALUES 31 (1, 'user', 'en', 'smith'), 32 (2, 'manga', 'zh', '砂輿海之歌'), 33 (3, 'user', 'ko', '지안'), 34 (4, 'drama', 'en', 'Mr.ROBOT'), 35 (5, 'movie', 'en', 'Avator'), 36 (6, 'movie', 'ru', 'Хардкор'), 37 (7, 'drama', 'zh', '大秦帝国') 38; 39 40# jp_threads 41# 掲示板のテーブル 42CREATE TABLE jp_threads 43 (thread_id int, thread_text text, thread_theme text, allowed_user_ids text) 44; 45INSERT INTO jp_threads 46 (thread_id, thread_text, thread_theme, allowed_user_ids) 47VALUES 48 (1, 'かわいい猫の画像スレ', '画像のこと', '"[1,2,3]"'), 49 (2, '結婚できない女のスレ', '結婚のこと', '"[2,3]"'), 50 (3, 'お酒に合う音楽のスレ', '音楽のこと', '"[1,3]"') 51; 52 53# jp_voices 54# コメントや返信のテーブル 55CREATE TABLE jp_voices 56 (voice_id int, thread_id int, parent_id int, voice_type text, voice_text text, up int, down int, attach_id int, attach_type text, attach_country text) 57; 58INSERT INTO jp_voices 59 (voice_id, thread_id, parent_id, voice_type, voice_text, up, down, attach_id, attach_type, attach_country) 60VALUES 61 (1, 1, 0, 'comment', '元気ですか?', 10, 15, 0, '', ''), 62 (2, 1, 1, 'reply', '元気ですよ!', 29, 28, 4, 'drama', 'en'), 63 (3, 2, 0, 'comment', '生きてますか?', 31, 37, 3, 'user', 'ko'), 64 (4, 2, 3, 'reply', '生きてますよ!', 46, 40, 0, '', ''), 65 (5, 2, 3, 'reply', '死んでますよ!', 52, 53, 0, '', ''), 66 (6, 2, 5, 'reply', '死んでますか!?', 69, 60, 0, '', ''), 67 (7, 1, 0, 'comment', '愛してますか?', 78, 73, 3, 'user', 'jp') 68; 69 70# jp_users 71# ユーザーのテーブル 72CREATE TABLE jp_users 73 (user_id int, unique_name text, nick_name text) 74; 75INSERT INTO jp_users 76 (user_id, unique_name, nick_name) 77VALUES 78 (1, 'ichiro', '田中一郎'), 79 (2, 'jiro', '田中二郎'), 80 (3, 'saburo', '田中三郎'), 81 (4, 'shiro', '田中四郎'), 82 (5, 'goro', '山田五郎'), 83 (6, 'rokuro', '山田六郎'), 84 (7, 'nanaro', '山田七郎') 85; 86
###「スレッドへのコメントリスト」
まずこちらが「スレッドへのコメントリスト」になりまして、thread_id=1
へのコメントを取得します。
SQL
1select * 2from 3jp_voices 4where 5thread_id=1 and voice_type='comment'
###「お気に入りリスト」
そしてこちらが「お気に入りリスト」になりまして、user_id=1
さんのfavorite
を取得します。
SQL
1 select 2 case 3 when actions.target_type='user' and actions.target_country_code='jp' 4 then users.user_id 5 else contents.content_id 6 end as content_id 7 , case 8 when actions.target_type='user' and actions.target_country_code='jp' 9 then users.nick_name 10 else null 11 end as nick_name 12 , case 13 when actions.target_type='thread' and actions.target_country_code='jp' 14 then threads.thread_text 15 else null 16 end as thread_text 17 , case 18 when (actions.target_type='user' and actions.target_country_code='jp') or actions.target_type='thread' 19 then null 20 else contents.content_title 21 end as content_title 22 , case 23 when (actions.target_type='user' and actions.target_country_code='jp') or actions.target_type='thread' 24 then actions.target_type 25 else content_type 26 end as content_type 27 , case 28 when (actions.target_type='user' and actions.target_country_code='jp') or actions.target_type='thread' 29 then actions.target_country_code 30 else contents.country_code 31 end as country_code 32 , max( case when 33 actions.action_name='follow' then actions.action_date end 34 ) as follow_date 35 , max( case when 36 actions.action_name='favorite' then actions.action_date end 37 ) as favorite_date 38 39 from jp_actions actions 40 41 # join 42 left join jp_threads threads 43 on actions.target_id=threads.thread_id 44 left join jp_users users 45 on actions.target_id=users.user_id 46 left join country_contents contents 47 on actions.target_id=contents.content_id 48 49 # 彼がactor_idであるfavoriteを指定 50 where actions.actor_id=1 51 # favorite_dateとfollow_dateが欲しいので以下を指定 52 and actions.action_name in ('favorite', 'follow') 53 and exists( 54 select 0 from jp_actions 55 where target_id=actions.target_id and action_name='favorite' 56 ) 57 # 彼とblock関係にあるjpのuserを除外 58 and not exists( 59 select 0 from jp_actions 60 where target_type='user' and target_country_code='jp' and action_name='block' 61 and target_id=actions.target_id and actions.target_type='user' 62 and actor_id=1 63 ) 64 65 group by actions.target_id, actions.target_type, actions.target_country_code 66 order by favorite_date desc
###試したこと
SELECT
の結果同士の連結になるかと思いますので、以下の方法を見つけました
SQL
1SELECT * 2FROM 3[テーブルA] 4INNER JOIN 5 ( 6 SELECT [項目B] 7 FROM XX 8 WHERE XX 9 )AS [結果セットC] 10ON [テーブルA].[項目C] = [結果セットC].[項目B] 11WHERE 12[テーブルA].[項目D] = 'XX'
そしてこの方法を「スレッドへのコメントリスト」と「お気に入りリスト」に適用したのが下記ですが、実現することができませんでした。
下記コードを実行する → 実現できずエラーでした
SQL
1SELECT * 2FROM 3jp_voices 4INNER JOIN 5 ( 6 # 「お気に入りリスト」のコードをここにコピペ 7 )AS list 8ON jp_voices.attach_id=list.content_id 9WHERE 10jp_voices.parent_thread_id=1 and voice_type='comment'
###補足情報(FW/ツールのバージョンなど)
phpMyAdmin(4.8.5)で、MySQL(10.0.33-MariaDB)を使っています。
冒頭の画像のような連結のために修正すべき箇所をご指導いただけませんでしょうか。
どうぞ宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー