我正在为我的网站设计一个“朋友”系统。我的数据库中有一个USERS表,该表中有两个字段叫“friendrequestssent”和“friendrequestsreceived”。
当用户向另一个用户发送好友请求时,它会将他的USERID存储到另一个人的“friendrequestsreceived”字段中,并将另一个人的USERID存储到他的“friendrequestssent”字段中,两者都带有一个尾随逗号(即:{{1} })。
我需要检查一下请求是否已经存在以防止重复请求,到目前为止我已经尝试过:
12345,
这首先很有用,但是当字段中存在多个以逗号分隔的值时(即:$sql = "SELECT * FROM users WHERE userid = $userid AND $profileid IN (friendrequestssent);";
$sent = mysql_num_rows(mysql_query($sql));
$sql = "SELECT * FROM users WHERE userid = $profileid AND $userid IN (friendrequestsreceived);";
$received = mysql_num_rows(mysql_query($sql));
if(($sent > 0) && ($received > 0)) {
//do stuff here
}
),IN语句不再找到该值,并且行数保持为零。
据我所知,我不明白为什么MySQL查询中的IN语句不会看到该值。
另一方面,我确信无论如何还有更好的方法。我还不确定。请指教。
答案 0 :(得分:1)
IN子句查看逗号分隔列表的各个成员,但是当您将该逗号分隔列表存储在单个字段中时,MySQL会将其视为单字符串值,因此您正在执行
... WHERE x IN ('1,2,3')
转换为
... WHERE x = '1,2,3'
要强制MySQL将CSV列表视为CSV而不是整体字符串,您需要FIND_IN_SET()
函数:
... WHERE FIND_IN_SET($profileid, friendrequestssent);
答案 1 :(得分:1)
不要将单个字段视为多行。为此使用表格。类似的东西:
friend_requests
===============
friend_id
requested_friend_id
friend_id
和requested_friend_id
将包含一个复合键。
答案 2 :(得分:0)
你的设计还可以,但如果你让我为你重新设计它会更好:
首先让你的桌面用户保持原样,然后用3个字段做一个新表:
您应该添加propper外键索引,并通过在不同列中存储相同的友谊来注意您可能有重复的请求。如果你有疑问,我可以更清楚这一点。
答案 3 :(得分:0)
你可以做的一件事是获取包含数组或字符串形式的所有id的整个条目,然后适当地进行字符串搜索或数组搜索以检查重复性。