我的数据库表中有一个存储类别的文件。我按以下格式存储类别:
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
子句但未找到任何结果。
任何人都可以请一些其他选择。
答案 0 :(得分:5)
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,.*'
returnig 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
)
答案 1 :(得分:3)
您在产品和类别之间存在多对多的关系。您应该创建一个新表来存储每个产品的相应类别(cat_ids)。您不应该有包含多个类别ID的列。这样您的选择会更容易,也更快。
答案 2 :(得分:3)
WHERE FIND_IN_SET('1', prod_catg)