2010-01-07 47 views

回答

2

首先匹配,在外地使用逗号分隔值是有问题的,你应该考虑将它们存储在一个sepatate表代替。那么你可以更有效地得到记录:

select ... 
from mainTable t 
inner join valueTable v1 on v1.id = t.id and v1.value = 1 
inner join valueTable v2 on v2.id = t.id and v2.value = 2 
inner join valueTable v3 on v3.id = t.id and v3.value = 3 

如果这是不可能的,你必须去慢字符串匹配的方式。要以逗号分隔字符串匹配值,你可以使用like操作:

... where 
    concat(',', someField, ',') like '%,1,%' and 
    concat(',', someField, ',') like '%,2,%' and 
    concat(',', someField, ',') like '%,3,%' 

把分离器上搜索值的两侧可以确保你没有得到任何误报。在字段值之前和之后添加逗号可确保您可以找到第一个和最后一个值。

+0

是啊正是我的想法。与单独的表是我看似不能做我想要的选择。 SELECT * FROM table WHERE id ='1'AND id ='2'AND id ='3'。在这种情况下,表格将是一个数据透视表:id,user_id,option_id – Cudos 2010-01-07 19:21:38

+0

@Cudos:​​您可以使用单独的表格轻松获得结果。查看我上面添加的查询示例。 – Guffa 2010-01-07 19:36:48

+0

@Guffa:我也在想这样的事情:'SELECT t.name FROM maintable t INNER JOIN valueTable v ON v.value IN(1,2,3)AND t.id = v.id GROUP BY t.name有计数(*)> = 3',虽然我没有测试过它。 – Powerlord 2010-01-07 19:56:15

2

使用正则表达式与正则表达式(^|,)1($|,)(^|,)2($|,)(^|,)3($|,)

1

您是否考虑过在最佳搜索值为11时对您的情况?

由于无法缩小搜索范围,因此注定要执行表扫描以查找相关值。

您应该认真考虑将这些值拆分为一个单独的表格,其中每个值有一行,全部链接回原始表格中的原始行。

这会更准确,性能更高,并且更容易处理。

说了这么多,如果你仍然想使用你目前的做法,可以为一个数值搜索通过这样做:

WHERE ','+ column + ',' LIKE '%,' + value + ',%' 

这将搜索',11,22,33,''%,11,%',注意逗号在两个各端该列和值,这将确保您不会因部分匹配而导致误报。

+0

从以下评论:与单独的表是我似乎无法做我想要的选择。 SELECT * FROM table WHERE id ='1'AND id ='2'AND id ='3'。在这种情况下,该表将是一个数据透视表:id,user_id,option_id。你将如何处理? – Cudos 2010-01-07 19:35:34

+0

假设您将字段拆分为单独的表格,您的意思是您希望选项1,2和3都存在的用户是否是? – 2010-01-07 20:21:37

+0

是的。你是正确的 - 无论是在你的假设和上面的代码。但是,正如你和上面的海报指出,应该做一个单独的表。看到他的SELECT后,我使用推荐的解决方案。 – Cudos 2010-01-07 21:26:01