背景信息:我正在尝试建立一个系统,用户可以请求其他用户成为他们的朋友。那些有未决好友请求的用户可以选择接受或拒绝所述好友请求。
问题:我想设置MySQL查询,以便当用户发出好友请求时,查询将首先检查发出好友请求的人是否已经是他们正在向好友请求的人的朋友在添加请求之前。
现在我有一个包含待处理请求的表和一个包含以下结构的朋友的表:
+---------+----------+ +-------------+-------------+
| friends | | friend_requests |
+---------+----------+ +-------------+-------------+
| userId | friendId | | requesterId | confirmerId |
+---------+----------+ +-------------+-------------+
| 11111 | 22222 | | | |
| 22222 | 11111 | | | |
| 11111 | 33333 | | | |
| 33333 | 11111 | +-------------+-------------+
+---------+----------+
现在假设用户11111想要尝试再次请求用户22222作为朋友。查询应该查看friends表并看到它们已经是朋友(即,存在userId = 11111和friendId = 22222的行),因此不会在friend_request表中插入任何内容。如果他们不是朋友,那么应该在friend_requests中插入一个新行。
到目前为止我尝试过(并且出现语法错误):
INSERT INTO friend_requests (requesterId, confirmerId)
SELECT 11111, 22222 WHERE NOT EXISTS (
SELECT * FROM friends WHERE userId = 11111 and friendId = 22222
)
如果可能的话,我希望在一个查询中执行此过程。任何写这个查询的帮助都将不胜感激。
答案 0 :(得分:1)
userId
,friendId
对上创建唯一约束:
create unique index idx_userId_friendId on friends(userId, friendId)
这将为数据库提供确保没有重复项的工作 - 这是在应用程序层执行此操作的更安全的替代方法。例如,如果两个用户同时互相交换,则您的查询具有竞争条件。
这意味着您需要在添加好友时检查错误。我建议使用on duplicate key set
方法:
除非在违反唯一约束时防止出现错误,否则分配实际上什么都不做。
根据您的示例数据,您的朋友"关系是可交换的。如果是这样,你应该同时进行两次插入:
INSERT INTO friend_requests (requesterId, confirmerId)
SELECT 11111, 22222
ON DUPLICATE KEY requesterId = VALUES(requesterId);
编辑:
哎呀,这是两个不同的表。我认为这将解决错误,并允许您只插入一次值:
INSERT INTO friend_requests (requesterId, confirmerId)
SELECT requesterId, confirmerId
FROM (SELECT 11111 as requesterId, 22222 as confirmerId) rc
WHERE NOT EXISTS (SELECT 1
FROM friends f
WHERE f.userId = rc.requesterId and f.friendId = rc.confirmerId
);
答案 1 :(得分:0)
在Sql Server中我完成了这件事
if ((SELECT count(*) FROM friends WHERE userId = 11111 and friendId = 22222)=0)
begin
INSERT INTO friend_requests (requesterId, confirmerId)
end