MySQL-在逗号分隔的数字字符串中查找数字

MySQL-在逗号分隔的数字字符串中查找数字,mysql,sql,query-string,Mysql,Sql,Query String,我有一个用户数据表。一个用户能够“阻止”另一个用户,拒绝他们访问他们的任何帖子(想想“社交媒体网站”) 如果“blockedUserID”是逗号分隔列表的名称,其中包含的ID是整数,我如何选择不阻止查看用户的用户 我试图实现的目标的非工作示例: SELECT * FROM users WHERE [the blocked user's ID] NOT IN blockeduserids; 您可以在此处使用FIND_IN_SET: SELECT * FROM users WHERE FIND_I

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

如果“
blockedUserID
”是逗号分隔列表的名称,其中包含的ID是整数,我如何选择不阻止查看用户的用户

我试图实现的目标的非工作示例:

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

您可以在此处使用
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\u IN\u 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);

这可能会大大超过您当前的方法。

谢谢!我尝试在_SET()中查找_(现在仍在尝试),但始终没有返回任何数据。我同意我没有立即以理想的方式实现这一点,但我肯定会在表之间建立关系,我相信第二个建议会奏效。
FIND_in_SET
有自己的特点。除非您搜索的CSV字符串没有空格(或者,如果有空格,那么我认为您的搜索字符串也必须与此匹配),否则它将无法工作。谢谢!我尝试在_SET()中查找_(现在仍在尝试),但始终没有返回任何数据。我同意我没有立即以理想的方式实现这一点,但我肯定会在表之间建立关系,我相信第二个建议会奏效。
FIND_in_SET
有自己的特点。除非您正在搜索的CSV字符串没有空格(或者,如果有空格,那么我认为您的搜索字符串也必须与此匹配),否则它将无法工作。请注意,您不应将其存储为逗号分隔的列表。这是一个非常有问题的设计。一个只有两列的新表,blocked_user_id和blocking_user_id,这两列都是主键,在PK中不是最左边的列上都有一个辅助索引,将更加正确和高效。当你放大时,你现在所做的绝对会在负载下崩溃,因为它需要扫描每一行来寻找匹配项。(此外,您还可以为阻塞添加日期列,稍后可能会很方便)。然后使用左连接或不存在的
进行查询。是的,谢谢。我现在正在改变这种方法。请注意,您不应该将其存储为逗号分隔的列表。这是一个非常有问题的设计。一个只有两列的新表,blocked_user_id和blocking_user_id,这两列都是主键,在PK中不是最左边的列上都有一个辅助索引,将更加正确和高效。当你放大时,你现在所做的绝对会在负载下崩溃,因为它需要扫描每一行来寻找匹配项。(此外,您还可以为阻塞添加日期列,稍后可能会很方便)。然后使用左连接或不存在的
进行查询。是的,谢谢。我现在正在改变这种方法。