如何检查逗号分隔字段中是否存在值?

时间:2011-10-03 17:29:55

标签: php mysql database select csv

我正在为我的网站设计一个“朋友”系统。我的数据库中有一个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语句不会看到该值。

另一方面,我确信无论如何还有更好的方法。我还不确定。请指教。

4 个答案:

答案 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_idrequested_friend_id将包含一个复合键。

答案 2 :(得分:0)

你的设计还可以,但如果你让我为你重新设计它会更好:

首先让你的桌面用户保持原样,然后用3个字段做一个新表:

  • 自动增量字段作为索引(如果需要,或者只是跳过此列)。
  • 您存储请求友谊的朋友并允许致电:friend_request。
  • 的字段
  • 存储正在接收友情请求的朋友的字段,然后调用ir:friend_receive_request。

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

答案 3 :(得分:0)

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