SQL中的多个LIKE

nin*_*inu 3 mysql phpmyadmin sql-like

我想搜索多行并获取包含特定项的行.

mySQL中的表是设置的,因此每个id都有一个唯一的列(逗号分隔)每行的值.

例如:

id | order
1  | 1,3,8,19,34,2,38
2  | 4,7,2,190,38
Run Code Online (Sandbox Code Playgroud)

现在,如果我想拉出仅包含数字19的行,我将如何进行此操作?我可以在LIKE条件列表中找到的可能性是:

19,     <-- 19 at the start of the list
,19     <-- 19 at the end of the list
,19,    <-- 19 inside the list
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容,但我无法获得任何结果,谢谢你的帮助!

SELECT *
FROM categories
WHERE order LIKE '19,%' OR '%,19%' OR '%,19%'
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)

ang*_*son 7

首先,你不应该存储这样的值,你应该使用每个项目一行的子表,这将使你当前的查询更容易处理,并允许使用索引.

话虽如此,你想要的是这个:

WHERE ',' + order + ',' LIKE '%,19,%'
Run Code Online (Sandbox Code Playgroud)

通过在order字段中的值列表之前和之后添加逗号,您可以在每一侧使用逗号查询该字段以获取所需的值,而不必处理该值的特殊情况,即第一个或列表中的最后一个值.

使用您列出的查询,您可以通过意识到OR不会给该LIKE子句提供更多参数来使其工作,它将完全不同的子句分开,从而重写SQL如下:

WHERE order LIKE '19,%' OR order LIKE '%,19,%' OR order LIKE '%,19'
                           ---+------      ^     ----+-----       ^
                              |            |         |            |
                              +- add this -+---------+            +- removed
                                                                     percent
Run Code Online (Sandbox Code Playgroud)

请注意第二个模式中缺少的逗号,它将匹配包含值19的字符串,并记下最后一个中删除的百分比字符,这将允许它匹配以19结尾的列表.


Mar*_*ers 6

您可以使用FIND_IN_SET以更简单的方式解决您的问题:

SELECT *
FROM categories
WHERE FIND_IN_SET('19', `order`)
LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)

通常,您应该尝试设计数据库,以便不需要此类操作.