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)
首先,你不应该存储这样的值,你应该使用每个项目一行的子表,这将使你当前的查询更容易处理,并允许使用索引.
话虽如此,你想要的是这个:
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结尾的列表.
您可以使用FIND_IN_SET以更简单的方式解决您的问题:
SELECT *
FROM categories
WHERE FIND_IN_SET('19', `order`)
LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)
通常,您应该尝试设计数据库,以便不需要此类操作.
| 归档时间: |
|
| 查看次数: |
7928 次 |
| 最近记录: |