【发布时间】:2010-01-08 03:45:12
【问题描述】:
我可以搜索 1 AND 2 AND 3 而不会因为字段中有 11、22、33 而得到错误匹配吗?
字符串 = "11,22,33" 的字段不应返回任何结果。
【问题讨论】:
我可以搜索 1 AND 2 AND 3 而不会因为字段中有 11、22、33 而得到错误匹配吗?
字符串 = "11,22,33" 的字段不应返回任何结果。
【问题讨论】:
首先,在字段中使用逗号分隔值是有问题的,您应该考虑将它们存储在单独的表中。然后你可以更有效地获取记录:
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,%'
将分隔符放在搜索值的两侧可确保您不会得到任何误报。在字段值之前和之后添加逗号确保您可以找到第一个和最后一个值。
【讨论】:
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 HAVING COUNT(*) >= 3 虽然我还没有测试过。
使用正则表达式匹配正则表达式 (^|,)1($|,) 和 (^|,)2($|,) 和 (^|,)3($|,)
【讨论】:
您是否考虑过在您的情况下对值 11 进行最佳搜索会做什么?
由于无法缩小搜索范围,因此注定要执行表扫描来查找相关值。
您应该认真考虑将这些值拆分到一个单独的表中,其中每个值有一行,全部链接回原始表中的原始行。
这会更正确、更高效、更容易处理。
话虽如此,如果您仍想使用当前的方法,您可以通过以下方式搜索值:
WHERE ','+ column + ',' LIKE '%,' + value + ',%'
这将在',11,22,33,' 中搜索'%,11,%',注意列和值两端的逗号,这将确保您不会因为部分匹配而得到误报。
【讨论】:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
FIND_IN_SET(1,column) AND FIND_IN_SET(3,column) AND etc;
它被设计为与 SET 类型一起使用,但它也适用于基本的逗号分隔列表。
【讨论】: