2011-10-03 136 views
1

我正在为我的网站设计一个“朋友”系统。我在我的数据库中有一个USERS表,这个表中有两个字段叫做“friendrequestssent”和“friendrequestsreceived”。如何检查逗号分隔字段中是否存在值?

当用户发送好友请求给其他用户,它存储了USERID到其他人的“friendrequestsreceived”字段和其他人的USERID到他的“friendrequestssent”领域,都与一个尾随逗号(即: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 
} 

这很好工作在第一,但如果用逗号隔开值存在于该字段中(即:12345,12346,),IN语句不再查找该值,并且行数保持为零。

据我所知,我不明白为什么MySQL查询中的IN语句不会看到该值。

另一方面,我敢肯定还有更好的方法来做到这一点。我现在还不确定。请指教。

+0

在数据库中的CSV是邪恶的,它会直接送你到地狱。 – Johan

+0

是不是IN()类型特定?即你不混合整数和字符串,而且你实际上是将一个整数(用户ID)传递给一个字符串(csv) - 如果没有逗号,它可能就可以评估一串数字作为一个整数。我不是100%确定,因为我从来没有在数据库中使用CSV - 他们只是尖叫着“这应该是一个链接表”给我... – CD001

回答

0

你的设计是好的,但它会更好,如果你让我重新设计这个给你:

首先离开你的表的用户,因为它是,然后做一个新表3个字段:

  • 作为索引的自动增量字段(如果需要,或者只是略过此列)。
  • 一个字段,您存储请求友谊的朋友并让我们调用:friend_request。
  • 一个字段,用于存储正在接收友谊请求的朋友,并允许呼叫ir:friend_receive_request。

您应该添加propper外键索引,并且请注意,通过在不同的列中存储相同的友谊,您可能会有重复的请求。如果您有问题,我可以更清楚地说明这一点。

+0

啊,是的,我可以看到如何为朋友请求提供一个单独的表格可以更有效率。我做了一些重新配置,它的工作非常好。谢谢! – vertigoelectric

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); 
+0

虽然为朋友请求创建一个单独的表是一个更有效的解决方案,你的答案仍然有用,以防我再次需要使用像'IN'这样的东西,我相信我会的。谢谢。 – vertigoelectric

1

不要将单个字段视为多行。为此使用一张桌子。喜欢的东西:

friend_requests 
=============== 
friend_id 
requested_friend_id 

friend_idrequested_friend_id将包括一个复合键。

0

你可以做的一件事就是获取包含所有id的整个条目,并以数组或字符串的形式适当地进行字符串搜索或数组搜索以检查重复。