4

我有一个看起来像这样的用户之间的友谊表。

CREATE TABLE user_relations (
pkUser1 INTEGER UNSIGNED NOT NULL,
pkUser2 INTEGER UNSIGNED NOT NULL,
pkRelationsType TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(pkUser1,pkUser2),
FOREIGN KEY(pkuser1) references users(ID),
FOREIGN KEY(pkuser2) references users(ID),
FOREIGN KEY(pkRelationsType) references user_relations_type(ID)
);

pkRelationsType是一个指向另一个表的指针,它定义了用户的关系类型(friendship(1)、pending(2) 或blocked(3))

如果用户 1用户 2的朋友,我只有一个实例|1|2|1|,而没有 |2|1|1|

问题是,为了阻止用户,我必须牢记关系可能已经建立(用户可能已经是朋友,甚至有待处理的友谊请求)所以我试图插入数据或更新它如果关系不存在。

我有这个友谊请求发送,但如果数据已经存在,这只是忽略插入。

INSERT INTO
user_relations(pkUser1,pkUser2,pkRelationsType)
SELECT * FROM (SELECT :sender0,:target0,2) AS tmp
WHERE NOT EXISTS
(SELECT pkUser1 FROM user_relations
    WHERE 
    (pkUser1= :sender1 AND pkUser2=:target1) OR (pkUser1=:sender2 AND pkUser1=:target2) LIMIT 1)

由于桌子的性质,我不能使用INSERT ... ON DUPLICATE KEY UPDATE

我一直在考虑用 PHP 处理它,搜索关系及其顺序(如果存在),然后做一件事或另一件事,但这似乎是浪费处理。

请注意,尽管到目前为止我已经处理过自己,但我不是 MYSQL 专家。希望我已经很好地解释了自己。

感谢您的反馈。

4

1 回答 1

1

从您的描述来看,您似乎只是保持“最新”的关系。如果是这种情况,为什么不先删除关系,然后插入新关系?

于 2013-06-04T17:15:05.113 回答