かなり初心者です。もしかしたら妙な事を訊いているのかもしれません。
php5.4.16とmysql5.5.32でSNSのフレンドリストのような機能を作ろうと思います。
フレンド最大数は1000とします。この場合、1000個もカラムを作るのでしょうか?
それとも、会員個別にテーブルを作ってそこで管理するのでしょうか。
もしくは、テーブルは一つとし、会員番号のカラムを二つ用意、関係性を示したテーブルを作るのでしょうか?
もしくは、カラムは一個で文字列で操作したりするのでしょうか?(カンマで区切る等)
パフォーマンス的にどの設計が正しくて、どの設計が間違いなのでしょうか…
回答よろしくお願いします。
No.1
- 回答日時:
通常なら「テーブルは一つとし、会員番号のカラムを二つ用意、関係性を示したテーブルを作る」だと思います。
No.2ベストアンサー
- 回答日時:
こんなデータの持ち方をすると集計しやすいかと
仮に長野、亀井、坂本、阿部、村田の5人がいて、
長野は亀井と友達、阿部は長野、亀井、坂本と友達、村田はぼっちだとすると
//元データ
create table user(uid int not null unique ,name varchar(20));
insert into user values(1,'長野'),(2,'亀井'),(3,'坂本'),(4,'阿部'),(5,'村田');
create table friend(id int primary key auto_increment,fid int,uid int,unique(fid,uid));
insert into friend(fid,uid) values(1,1),(1,2),(2,1),(2,4),(3,2),(3,4),(4,3),(4,4);
※friendテーブルのfidは友達二人をつなぐためのリンク用id
(1)各自友達が何人いるか集計する
select user.uid,name,coalesce(count,0) as count from user
left join(
select uid,count(*) as count from friend
group by uid
) as sub on sub.uid=user.uid
order by uid;
(2)各自の友達の名前を羅列する
select u1.uid,u1.name,friends
from user as u1
left join(
select f1.uid,group_concat(u2.name) as friends
from friend as f1
inner join friend as f2 on f1.fid=f2.fid and not f1.uid=f2.uid
inner join user as u2 on f2.uid=u2.uid
group by uid
) as sub on u1.uid=sub.uid
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- その他(プログラミング・Web制作) google formsで回答者をスプレッドシートに記載する方法 1 2023/06/23 11:22
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQL AUTO_INCREMENTが最大に...
-
WHEREなどの条件が多い場合、ど...
-
フレンドリストのようなものを...
-
DBエラーの意味
-
LIKEの右側にカラムを指定でき...
-
SQLServerでNULLを挿入したいです
-
スペースによる絞り込み検索をS...
-
SQLステータス:37000について
-
一部のカラムでdistinctし全て...
-
whereで全てを検索する方法
-
now()かCURRENT_TIMESTAMPか
-
End Ifに対応するIfブロックが...
-
複数カラムに対するLIKE文の最適化
-
UNIONする際、片方テーブルしか...
-
INDIRECT関数の代替方法は?
-
Select文で結合した時に、重複...
-
SQL Serverのntext型で一意イン...
-
エクセルかワードで家系図を作...
-
type date にnullをinsert
-
場合の数 中学入試 5枚のカード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルの列数を調べたい
-
group byで最後のレコードを抽...
-
MYSQLで小数点を表示する場合と...
-
[MySQL]LOAD DATA INFILE一部レ...
-
フレンドリストのようなものを...
-
WHEREなどの条件が多い場合、ど...
-
MYSQLのストアドでの動的SQLに...
-
select * での表示が崩れる?
-
MySQL AUTO_INCREMENTが最大に...
-
MySQL 改行コードを含む文字列...
-
「VARCHAR(255)」を「text」に...
-
MySQL テーブルの一部のカラム...
-
betweenを使うyyyy/mm/ddでの範...
-
MySQLのselect文で、最大ID値の...
-
ここで「INSERT INTO」を使う意...
-
データの暗号化について
-
時間範囲が重複したレコードを...
-
MYSQLのレコードを上書きしたい...
-
誤って削除したIDカラムを復元...
-
INDIRECT関数の代替方法は?
おすすめ情報