这里有一些很好的答案,如果我不得不这样做我会做的一种方式,这种方式可以决定是否友谊得到了证实,并确保友谊是相互的,因此,例如
让我们假设状态有两个值
0 = Unconfirmed
10 = Confirmed
使用简单的表格与接受水平状态
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`user_id`),
);
CREATE TABLE `friend` (
`user_id` bigint(20) unsigned NOT NULL,
`friend_id` bigint(20) unsigned NOT NULL,
`status` int(11) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`friend_id`)
);
INSERT INTO `users` (`id`, `name`) VALUES
(1, 'Jack'),
(2, 'John');
杰克想成为朋友约翰,所以你会创建两个只有一条路之间的关系:
INSERT INTO `friend` (`user_id`, `friend_id`, `status`) VALUES (1, 2, 0);
现在,您可以查询数据库,找到千斤顶朋友或千斤顶请求和约翰的朋友或约翰请求使用简单的查询
为了找到杰克,你会使用类似
SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1 AND friend.status = 0
要找到千斤顶确认的朋友,你会使用类似
未经证实的朋友
SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1 AND friend.status = 10
要找到千斤顶任何好友请求,你会使用类似
SELECT users.* FROM users JOIN friend ON users.id = friend.user_id WHERE friend.friend_id = 1
当有人友谊的确认,你将执行2个查询,一个用于更新记录,一个作为反向确认
UPDATE friend SET status = 10 WHERE user_id = 1 AND friend_id = 2;
INSERT INTO `friend` (`user_id`, `friend_id`, `status`) VALUES (2, 1, 10);
在不同的音符,我也将使用复杂关系查询图形数据库,而在MySQL数据库中保持坚定的副本
图传情的朋友的朋友建立关系
MATCH (Person { id: 1 })-[:knows*2..2]->(friend_of_friend) WHERE NOT (Person)-[:knows]->(friend_of_friend) AND NOT friend_of_friend.id = 1 RETURN friend_of_friend.id, friend_of_friend.name LIMIT 10
您能解释的背景和你希望摆脱它呢?目前还不清楚,所以帮助并不容易。 – FrustratedWithFormsDesigner 2010-08-26 19:20:40
更新希望它可以帮助 – Karem 2010-08-26 19:38:47