繁体   English   中英

Mysql 中 LIKE 子句的替代方案

[英]Alternative to LIKE clause in Mysql

我的数据库表中有一个存储类别的文件。 我以以下格式存储类别:

1,12,15

现在,当我尝试从类别 1 中搜索产品时,我在查询中使用LIKE子句,例如

where (prod_catg LIKE %1,% or prod_catg LIKE %1% or prod_catg LIKE %,1% )

这将返回所有三个类别 1,12 和 15 的产品。相反,我只想要类别 1 的产品。

我也尝试过IN子句,但没有找到结果。

谁能给我建议一些其他的选择。

prod_catg LIKE '1,%' --matches when 1 is the first category
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
OR prod_catg LIKE '%,1' --matches 1 when is the last category

无论如何,您最好通过在产品(主)表上添加类别表和对它的引用来重构您的架构

编辑

面对这个问题的另一种方法是使用REGEXP这将导致更短的WHERE子句(这是我用来测试的):

DECLARE @regexp VARCHAR(100);
SET @regexp = '^1,.*|.*,1$|.*,1,.*';

SELECT
    '1,11,15,51,22,31' REGEXP @regexp AS test1,
    '51,11,15,1,22,31' REGEXP @regexp AS test2,
    '11,15,51,22,31,1' REGEXP @regexp AS test3,
    '7,11,15,51,22,31' REGEXP @regexp AS test4,
    '51,11,15,7,22,31' REGEXP @regexp AS test5,
    '11,15,51,22,31,7' REGEXP @regexp AS test6;

这会将您的prod_catg与正则表达式'^1,.*|.*,1$|.*,1,.*'匹配,如果匹配则返回1 (TRUE) ,否则返回0 (FALSE)

然后您的 WHERE 子句将如下所示:

WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'

正则表达式的解释:

^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
| --is the OR operator

我敢肯定这个正则表达式可以更紧凑,但我对正则表达式不太好

显然,您可以在正则表达式中更改您要查找的类别(尝试在上面的示例中将1替换为7

产品和类别之间存在多对多关系。 您应该创建一个新表来存储每个产品的对应类别(cat_ids)。 您不应该有一列包含多个类别 ID。 这样你的 select 会更容易,也更快。

WHERE FIND_IN_SET('1', prod_catg)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM