前提・実現したいこと
最終的な目標としては
➀main_datas
➁sub_datas
➂action_datas
という3つのテーブルから「スレッド20のフォロワーリスト」というHTMLを出力することです。
そのために
➃thread_followers
が必要と考えているのですが、これを作成するSQLで躓いています。
発生している問題
➀➁➂から➃が作れないことが問題です。
該当のテーブル(➀➁➂)
冒頭の画像の値を入れたテーブルをご用意いたしました。
SQL fiddle
※Orlofsky様からご指摘を受け、上記SQL fiddleのコードを下記に掲載させて頂きます。
SQL
1# main_datas の作成 2CREATE TABLE main_datas 3 (`main_id` int, `unique_name` varchar(5), `nick_name` varchar(2)) 4; 5INSERT INTO main_datas 6 (`main_id`, `unique_name`, `nick_name`) 7VALUES 8 (1, 'one', '一郎'), 9 (2, 'two', '次郎'), 10 (3, 'three', '三郎') 11; 12 13# sub_datas の作成 14CREATE TABLE sub_datas 15 (`sub_id` int, `user_id` int, `sub_key` varchar(7), `sub_val` varchar(3)) 16; 17INSERT INTO sub_datas 18 (`sub_id`, `user_id`, `sub_key`, `sub_val`) 19VALUES 20 (1, 1, 'age', '10歳'), 21 (2, 1, 'address', '東京'), 22 (3, 2, 'age', '20歳'), 23 (4, 2, 'address', '神奈川'), 24 (5, 3, 'age', '30歳'), 25 (6, 3, 'address', '千葉') 26; 27 28# action_datas の作成 29CREATE TABLE action_datas 30 (`action_id` int, `action_name` varchar(8), `action_date` varchar(4), `actor_id` int, `target_id` int, `target_type` varchar(6)) 31; 32INSERT INTO action_datas 33 (`action_id`, `action_name`, `action_date`, `actor_id`, `target_id`, `target_type`) 34VALUES 35 (1, 'follow', '1月1日', 1, 2, 'user'), 36 (2, 'follow', '2月2日', 1, 20, 'thread'), 37 (3, 'follow', '3月3日', 2, 20, 'thread'), 38 (4, 'favorite', '4月4日', 3, 2, 'user'), 39 (5, 'follow', '5月5日', 3, 20, 'thread'), 40 (6, 'favorite', '6月6日', 1, 3, 'user') 41; 42
試したこと
まずは➃のテーブルを作る原型となる➀➁の連結はできました。
あとは「#ここにfollow_date」と「#ここにfavorite_date」を追加できれば➃のテーブルが出来そうです。
# ➃のテーブル SELECT m.main_id, m.unique_name AS unique_name, m.nick_name AS nick_name, (select sub_val from sub_datas where user_id = m.main_id and sub_key = 'age' ) as age, (select sub_val from sub_datas where user_id = m.main_id and sub_key = 'address' ) as address #ここにfollow_date #ここにfavorite_date FROM main_datas m;
問題の部分ですが、下記のようにサブクエリの中で「# サブクエリを使いthread_id=20をfollowした人を取得」として、上の「#ここにfollow_date」と「#ここにfavorite_date」に入れてみたのですが、このあたりかなりわかっておらず、お目汚しかとは存じますがこのレベルです。
# ➃のテーブル SELECT m.main_id, m.unique_name AS unique_name, m.nick_name AS nick_name, (select sub_val from sub_datas where user_id = m.main_id and sub_key = 'age' ) as age, (select sub_val from sub_datas where user_id = m.main_id and sub_key = 'address' ) as address, (select action_date from followers where actor_id = u.ID ) as follow_date, (select action_date from followers where actor_id = u.ID ) as favorite_date, FROM main_datas m; # サブクエリを使いthread_id=20をfollowした人を取得 WHERE m.main_id IN (SELECT actor_id, action_date, FROM action_datas WHERE action_name = "follow" AND target_type = "thread" AND target_id = 20 ) AS followers
そして上の「# サブクエリを使いthread_id=20をfollowした人を取得」の部分がよくわからないので次は下記のように「# ビューを作りthread_id=20をfollowした人を取得」という感じで試してみたのですが、やはり理解が追い付ておらずできませんでした。
# ➃のテーブル # 同上 # ビューを作りthread_id=20をfollowした人を取得 CREATE VIEW followers actor_id, action_time, AS SELECT actor_id, action_time, FROM action_datas WHERE action_name = "follow" AND target_type = "thread" AND target_id = 20
サブクエリなのかビューなのか、また別のものが相応しいのか、そういった点がそもそもわからないという状況であれこれ試したわけですがどうしてもできず、今回質問サイトを利用させて頂くことになりました。
どのようにすれば➃のテーブルが作成できるでしょうか。
またそもそも、「スレッド20のフォロワーリスト」というHTMLを出力するためには➃のテーブルよりももっと良いものがございますでしょうか。
そのあたりにつきましてご回答いただけましたら幸甚に存じます。
どうぞ宜しくお願い致します。
補足情報(FW/ツールのバージョンなど)
phpMyAdmin(4.8.5)で、MySQL(10.0.33-MariaDB)を使っています。
回答1件
あなたの回答
tips
プレビュー