現在SNSサイトの作成をしておりまして、その際のデーターベースの構造が私の求めている物になっているかご教授のほどよろしくお願いします。以下使用中のテーブルとデータの情報です。SNSサイトですのでツイートテーブルもありますが、ここでは関係がないので省略します。
SQL
1CREATE TABLE `user` ( 2 userid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 name varchar(100) NOT NULL, 4 pass varchar(100) NOT NULL 5) ; 6 7INSERT INTO `user` (`name`, `pass`) VALUES 8('Chandler', 'temp'), ('Ken', 'temp'), ('Ross', 'temp'), ('Joye', 'temp'), ('Tag', 'temp'), 9('Matt', 'temp'), ('Rachel', 'temp'), ('Bob', 'temp'), ('Lisa', 'temp'), ('Hanks', 'temp'), 10('Ben', 'temp'), ('Kazu', 'temp'), ('Tobby', 'temp'), ('David', 'temp'), ('Mike', 'temp'), 11('Gary', 'temp'), ('Ellen', 'temp'), ('Emilly', 'temp'), ('Carol', 'temp'), ('Frank', 'temp'); 12 13CREATE TABLE `follow` ( 14 id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 15 userid int(11) NOT NULL, 16 followingid int(11) NOT NULL, 17 status int(11) NOT NULL 18) ; 19 20INSERT INTO `follow` (`userid`,`followingid`, `status`) VALUES 21(1,2,1),(1,3,1),(1,7,1),(1,8,1),(4,3,1), 22(4,8,1),(4,7,1),(6,10,1),(7,10,2),(19,20,2), 23(8,10,1),(2,3,1); 24
*followのstatusの値はとなっております。
1申請許可済(友達)
2申請中
3申請却下
質問❶
id userid followingid status
* 1 2 2
のstatusが承認され1となった場合は、userid1とuserid2は友達ということになりますが、
この場合
id userid followingid status
* 2 1 1
と言うuseridが2の行は追加する必要はないと言う認識でよろしいでしょうか。
つまり
id userid followingid status
* 1 2 1
id userid followingid status
* 2 1 1
とする必要はないですよね。
質問❷
『友達かも』リストを作成します。条件は現在使用中ユーザーの友達の、友達を抽出したいのですが以下の文で合っていますか。使用中のユーザはuserid1とします。当然友達ですのでstausは1であるものに限ります。この場合以下のSQL文で合っています。
SQL
1CREATE TABLE `user` ( 2 userid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 name varchar(100) NOT NULL, 4 pass varchar(100) NOT NULL 5) ; 6 7INSERT INTO `user` (`name`, `pass`) VALUES 8('Chandler', 'temp'), ('Ken', 'temp'), ('Ross', 'temp'), ('Joye', 'temp'), ('Tag', 'temp'), 9('Matt', 'temp'), ('Rachel', 'temp'), ('Bob', 'temp'), ('Lisa', 'temp'), ('Hanks', 'temp'), 10('Ben', 'temp'), ('Kazu', 'temp'), ('Tobby', 'temp'), ('David', 'temp'), ('Mike', 'temp'), 11('Gary', 'temp'), ('Ellen', 'temp'), ('Emilly', 'temp'), ('Carol', 'temp'), ('Frank', 'temp'); 12 13CREATE TABLE `follow` ( 14 id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 15 userid int(11) NOT NULL, 16 followingid int(11) NOT NULL, 17 status int(11) NOT NULL 18) ; 19 20INSERT INTO `follow` (`userid`,`followingid`, `status`) VALUES 21(1,2,1),(1,3,1),(1,7,1),(1,8,1),(4,3,1), 22(4,8,1),(4,7,1),(6,10,1),(7,10,2),(19,20,2), 23(8,10,1),(2,3,1); 24 25SELECT * FROM follow 26WHERE (userid IN(SELECT followingid FROM follow WHERE userid = 1) OR 27followingid IN(SELECT followingid FROM follow WHERE userid = 1)) 28AND userid NOT IN(1) 29ANd status = 1;
質問❸
質問❶の認識が正しい場合、
id userid followingid status
* 1 2 1
という行が存在した場合、
id userid followingid status
* 2 1 1
という行は存在してはいけないことになりますが、userid followingid をが逆にしたものは同じなので追加出来ないという制御は、カラムの型の様に設定する方法はないでしょうか。つまり追加int型にvarchar型を追加しようとした際にSQL文エラーが出る様な感じです。
【追記❶】
SQL
1INSERT INTO `follow` (`userid`,`followingidid`, `status`) VALUES 2(1,2,1),(1,3,1),(1,7,1),(1,8,1),(4,3,1), 3(4,8,1),(4,7,1),(6,10,1),(7,10,2),(19,20,2), 4(8,10,1),(2,3,1)(15,1,1),(14,1,1),(13,1,1) 5(12,1,1),(11,1,2),(1,9,2);
の関係で使用中ユーザのidが1の場合に『友達かも』として抽出したい値は以下になります。
useridが4,10このつだけになります。
SQL
1SELECT * FROM user WHERE userid 2IN 3(SELECT userid FROM follow WHERE followingid = 1 and status = 1 4UNION ALL 5SELECT followingid FROM follow WHERE userid = 1 and status = 1);
このSQL文を実行すると、1と友達関係にあるuser2,3,7,8,12,13,14,15
が抽出されます。
次に、このユーザーidと友達関係にあるものを、順に見ていきます。(ユーザー1を除く)
2と友達関係にあるのは3のみですが、3既に1と友達関係にあるので必要がありません。
次に3と友達関係にあるのは2ですがこれも同様に1と既に友達関係にあるためいりません。
次に7と友達関係にあるのは4,10です。これはどちらとも1とは友達関係にありませんので、『友達かも』として必要です。
これを全ての数字に割り当てたいのです。どうかご教授のほどよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/17 08:25
2018/12/17 08:31
2018/12/17 08:32
2018/12/17 08:36
2018/12/17 09:04
2018/12/17 09:09
2018/12/17 09:26
2018/12/17 12:14 編集
2018/12/17 12:09
2018/12/17 12:13
2018/12/17 12:26
2018/12/18 07:27
2018/12/18 16:42
2018/12/19 07:28