【问题标题】:How do I check to see if value exists within comma-separated field?如何检查逗号分隔字段中是否存在值?
【发布时间】:2011-11-30 02:41:15
【问题描述】:

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

另一方面,我确信无论如何都有更好的方法来做到这一点。我只是不确定如何。请指教。

【问题讨论】:

  • 数据库中的 CSV 是邪恶的,它会让你直接下地狱。
  • IN() 类型不是特定的吗?即,您不会混合整数和字符串,而是有效地将整数(用户 ID)传递给字符串(csv) - 只需一个条目就可以了,如果没有逗号,它可能能够评估整数字符串。我不是 100% 确定的,因为我从不在数据库中使用 CSV - 他们只是对我尖叫“这应该是一个链接表”......

标签: php mysql database select csv


【解决方案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);

【讨论】:

  • 虽然为好友请求创建单独的表格是一种更有效的解决方案,但如果我需要再次使用 IN 之类的东西,您的回答仍然很有帮助,我相信我会的.谢谢。
【解决方案2】:

不要将单个字段视为多行。为此使用一张桌子。比如:

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

friend_idrequested_friend_id 将组成一个复合键。

【讨论】:

    【解决方案3】:

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

    首先让表用户保持原样,然后创建一个包含 3 个字段的新表:

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

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

    【讨论】:

    • 啊,是的,我可以看到朋友请求的单独表格如何更有效。我做了一些重新配置,它工作得很好。谢谢!
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 2021-09-15
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2022-06-10
      • 2014-05-06
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多