我没有设计每个关系有两个记录的数据库,而是选择了一行。让自己陷入困境!
这是表格:
CREATE TABLE `friends` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id_1` int(11) unsigned NOT NULL,
`status_1` tinyint(1) NOT NULL DEFAULT '0',
`user_id_2` int(11) unsigned NOT NULL,
`status_2` tinyint(1) NOT NULL DEFAULT '0',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_rela` (`user_id_1`,`user_id_2`),
KEY `user_id_2` (`user_id_2`)
) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8;
我对这个设计有几个问题。
http://www.sqlfiddle.com/#!2/c6ccb8/2
首先,我无法为当前用户选择状态。因为当前用户可以在user_id_1或user_id_2中的任何位置。
SELECT DISTINCT
friends.friend_id
FROM (
SELECT created,
CASE user_id_1 WHEN 1 THEN user_id_2
ELSE user_id_1
END AS friend_id
FROM friends
WHERE 1 IN (user_id_1, user_id_2)
) friends
ORDER BY friends.created DESC
我面临的第二个问题是当前用户的更新状态。如果他接受友谊,我如何更新status_1或status_2中的正确值?
这个问题有解决方法吗?或者如果我使用更简单的AB BA模式,每个关系有两行,它会更好吗?
答案 0 :(得分:0)
你真的应该检查你的设计,以便减少列数,每个友谊只有1行:
应该是这样的:
id asker_user_id asked_user_id friendship_status timestamp
198 21 92 NULL '2013-11-02 9:00:00'
199 27 92 1 '2013-11-03 9:00:00'
198 91 21 0 '2013-11-04 9:00:00'
现在我不知道你想如何管理你的友谊状态......
但只有你能够做出那些设计决定。