【问题标题】:MySQL - Find number in string of comma-separated numbersMySQL - 在逗号分隔的数字字符串中查找数字
【发布时间】:2018-11-12 19:00:08
【问题描述】:

我有一个用户数据表。用户可以“阻止”另一个用户,拒绝他们访问他们的任何帖子(想想“社交媒体网站”)。

如果'blockeduserids'是逗号分隔列表的名称,并且其中包含的ID是整数,如何选择不阻止查看用户的用户?

我正在尝试实现的非工作示例:

SELECT * FROM users WHERE [the blocked user's ID] NOT IN blockeduserids;

【问题讨论】:

  • 请注意,您不应将其存储为逗号分隔的列表。这是一个非常有问题的设计。一个只有两列的新表,blocked_user_id 和 blocking_user_id,两列都作为主键,并且在 PK 中不是最左边的任何列上都有一个二级索引,这将更加正确和高效。当您扩大规模时,您现在正在做的事情在负载下绝对会崩溃,因为它需要扫描每一行以寻找匹配项。 (您也可以为阻止添加一个日期列,稍后可能会很方便)。然后使用左连接或WHERE NOT EXISTS 进行查询。
  • 好的,谢谢。我现在正在改变这种方法。

标签: mysql sql query-string


【解决方案1】:

您可以在这里使用FIND_IN_SET

SELECT *
FROM users
WHERE FIND_IN_SET('blockedid', blockeduserids) = 0;

但是,一般来说,不希望在数据库表中保留逗号分隔的字符串。更好的设计是将每个被阻止的用户 ID 放在单独的表中。如果你有这样一个单独的表,你可以这样写:

SELECT *
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blockeduserstable b WHERE u.user_id = b.user_id);

这可能会大大优于您当前的方法。

【讨论】:

  • 谢谢!我尝试了 FIND_IN_SET() (并且仍在尝试),但我一直没有返回任何数据。我同意我并没有立即以理想的方式解决这个问题,但肯定会在表之间建立关系,我相信第二个建议会奏效。
  • FIND_IN_SET 有自己的特点。除非您正在搜索的 CSV 字符串没有空格(或者,如果有空格,那么我认为您的搜索字符串也必须与此匹配),否则它将不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2013-03-16
  • 2012-12-23
相关资源
最近更新 更多