【问题标题】:Alternative to LIKE clause in MysqlMysql 中 LIKE 子句的替代方案
【发布时间】:2011-08-12 10:06:56
【问题描述】:

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

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 子句,但没有找到结果。

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

【问题讨论】:

  • 你应该通过添加一个表category来规范你的scema,然后在主表中引用它

标签: mysql


【解决方案1】:
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

【讨论】:

    【解决方案2】:
    WHERE FIND_IN_SET('1', prod_catg)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-08
        相关资源
        最近更新 更多