我有一个看起来像这样的用户之间的友谊表。
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 专家。希望我已经很好地解释了自己。
感谢您的反馈。