我是SQL的新手,我正在首先尝试尽可能多地学习,因为我正在编码,这很难,因为我正在设计数据库,我将不得不忍受一段时间,所以我我想确保我做得对.我学习了多对多桥接表的基础知识,但是如果这两个字段是相同的类型呢?让我们说一个拥有数千名用户的社交网络,你会如何创建一个表来跟踪谁是谁的朋友?如果有关于每个关系的其他数据怎么办,比如说......"约会对象".知道会有"在dateY和dateZ之间显示所有userX朋友"之类的查询.我的数据库有几种这样的情况,我无法找到一种有效的方法.既然它对我来说很重要,我认为其他人已经找到了设计表格的最佳方法,对吧?
tot*_*dli 34
创建一个User
表,然后创建一个表Relationships
,您可以在其中存储id
两个朋友的关系以及关于他们关系的任何类型的信息.
CREATE TABLE `Users` (
`id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `Relationships` (
`id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL,
`userid` TINYINT NULL DEFAULT NULL,
`friendid` TINYINT NULL DEFAULT NULL,
`friended` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
ALTER TABLE `Relationships` ADD FOREIGN KEY (userid) REFERENCES `Users` (`id`);
ALTER TABLE `Relationships` ADD FOREIGN KEY (friendid) REFERENCES `Users` (`id`);
Run Code Online (Sandbox Code Playgroud)
在使用数据填充表后,您可以创建SQL SELECT
查询以获取所有朋友.你的朋友是那些id
在你的身份在另一边而在一边的人.您检查双方,id
这样您就不需要存储两次关系.此外,你必须排除你的id
,因为你不能成为自己的朋友(在一个正常,健康的世界).
SELECT *
FROM Users u
INNER JOIN Relationships r ON u.id = r.userid
INNER JOIN Relationships r ON u.id = r.friendid
WHERE
(r.userid = $myid OR r.friendid = $myid)
AND r.friended >= $startdate
AND r.friended <= $enddate
AND u.id != $myid;
Run Code Online (Sandbox Code Playgroud)
其中$myid
,$startdate
也$enddate
可以是PHP变量,所以在双引号中,您可以将此代码直接传递给您的数据库.
单个链接表就足够了,如下所示:
People( PersonId bigint, Name nvarchar, etc )
Friends( FromPersonId bigint, ToPersonId bigint, DateAdded datetime )
Run Code Online (Sandbox Code Playgroud)
示例查询:
SELECT
People.Name
FROM
Friends
INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
Friends.ToPersonId = @myPersonId
Run Code Online (Sandbox Code Playgroud)
SELECT
People.Name
FROM
Friends
INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
Friends.ToPersonId = @myPersonId
AND
Friends.DateAdded >= @startDate
AND
Friends.DateAdded <= @endDate
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
62031 次 |
最近记录: |