MySQL选择列中包含值的行

MySQL选择列中包含值的行,mysql,sql,Mysql,Sql,我尝试过使用LIKE,但遇到了一些问题,我将在下面解释 我有一个字符串列,看起来像其中任何一个。 1010, 2020, 3030 1010 我想看看这个字符串是否包含一个ID,例如2020。如果是,则返回该行。我尝试使用like,但如果id为20,它将返回该行,因为2020包含20 选择整个数据库,然后使用分隔符遍历所有字符串将花费太多时间。是否可以实现此功能?首先,您不应该将事物列表存储在字符串变量中。SQL有一个非常好的列表数据结构。它叫桌子。这样一个表中的每一行都有一个id和列表中的一

我尝试过使用LIKE,但遇到了一些问题,我将在下面解释

我有一个字符串列,看起来像其中任何一个。 1010, 2020, 3030 1010

我想看看这个字符串是否包含一个ID,例如2020。如果是,则返回该行。我尝试使用like,但如果id为20,它将返回该行,因为2020包含20


选择整个数据库,然后使用分隔符遍历所有字符串将花费太多时间。是否可以实现此功能?

首先,您不应该将事物列表存储在字符串变量中。SQL有一个非常好的列表数据结构。它叫桌子。这样一个表中的每一行都有一个id和列表中的一个值

也就是说,有时候你会被这样的数据困住。在这种情况下,可以使用find_In-set:

您也可以使用like进行逻辑操作,但是MySQL具有方便的内置函数

编辑:

如果要使用类似的工具执行此操作:


请注意,分隔符保护值,因此20不会与2020混淆。

这就是为什么不在单个字段中存储多个值的原因。由于您的设计不好,因此每次都必须使用此查询结构来弥补此缺陷:

WHERE
       foo = 2020            // exact match, only value in field
    OR foo LIKE '2020,%'     // value is at start of field
    OR foo LIKE '%,2020,%'   // value is somewhere in the middle of the field
    OR foo LIKE '%,2020'     // value is at the end of the field
或者你可以有一个适当的规范化设计,然后就这么做了

WHERE childtable.foo = 2020
完成它。

没错,但“在集合中查找”一定要进行表格扫描。@BillKarwin。就像在这种情况下一样。
WHERE
       foo = 2020            // exact match, only value in field
    OR foo LIKE '2020,%'     // value is at start of field
    OR foo LIKE '%,2020,%'   // value is somewhere in the middle of the field
    OR foo LIKE '%,2020'     // value is at the end of the field
WHERE childtable.foo = 2020