回答
首先匹配,在外地使用逗号分隔值是有问题的,你应该考虑将它们存储在一个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,%'
把分离器上搜索值的两侧可以确保你没有得到任何误报。在字段值之前和之后添加逗号可确保您可以找到第一个和最后一个值。
使用正则表达式与正则表达式(^|,)1($|,)
和(^|,)2($|,)
和(^|,)3($|,)
您是否考虑过在最佳搜索值为11时对您的情况?
由于无法缩小搜索范围,因此注定要执行表扫描以查找相关值。
您应该认真考虑将这些值拆分为一个单独的表格,其中每个值有一行,全部链接回原始表格中的原始行。
这会更准确,性能更高,并且更容易处理。
说了这么多,如果你仍然想使用你目前的做法,可以为一个数值搜索通过这样做:
WHERE ','+ column + ',' LIKE '%,' + value + ',%'
这将搜索',11,22,33,'
为'%,11,%'
,注意逗号在两个各端该列和值,这将确保您不会因部分匹配而导致误报。
从以下评论:与单独的表是我似乎无法做我想要的选择。 SELECT * FROM table WHERE id ='1'AND id ='2'AND id ='3'。在这种情况下,该表将是一个数据透视表:id,user_id,option_id。你将如何处理? – Cudos 2010-01-07 19:35:34
假设您将字段拆分为单独的表格,您的意思是您希望选项1,2和3都存在的用户是否是? – 2010-01-07 20:21:37
是的。你是正确的 - 无论是在你的假设和上面的代码。但是,正如你和上面的海报指出,应该做一个单独的表。看到他的SELECT后,我使用推荐的解决方案。 – Cudos 2010-01-07 21:26:01
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类型可以使用,但它也可以有一个基本的逗号分隔列表。
- 1. 在mysql字段中搜索
- 2. 跨搜索字段的mysql搜索
- 3. Mysql,在JSon字段中搜索?
- 4. mysql在文本字段中搜索catid
- 5. MySQL搜索VARCHAR字段中的数字
- 6. Mysql搜索多个字段
- 7. MySQL PHP搜索多字段字段
- 8. MYSQL搜索表中的空字段
- 9. MySQL的 - 搜索在多值字段
- 10. 搜索在MySQL文本字段
- 11. 在Lucene中搜索字段
- 12. MySQL:搜索特定类型字段中的所有字段
- 13. 搜索字段中的搜索图标
- 14. 在MySQL LongText字段中搜索字符串的'正确'方法?
- 15. PHP MySQL - 带空格的搜索字段
- 16. MYSQL:枚举字段NULL搜索值
- 17. 从mySQL搜索填充表格字段
- 18. 搜索所有字段的MYSQL查询?
- 19. 如何在apache lucene中搜索非索引字段搜索
- 20. 搜索在not_analyzed字段
- 21. 搜索字段在sencha touch
- 22. 搜索字段在Django
- 23. 在mysql中搜索
- 24. 搜索在MySQL中
- 25. TreelistEx搜索字段
- 26. 搜索字段 - laravel
- 27. 如何在MySQL中通过date_format字段进行搜索
- 28. 需要在一个字段中搜索两个值Mysql
- 29. 如何在MySQL中搜索带有JSON值的字段?
- 30. MySQL - 在文本字段中搜索单词,显示整行?
是啊正是我的想法。与单独的表是我看似不能做我想要的选择。 SELECT * FROM table WHERE id ='1'AND id ='2'AND id ='3'。在这种情况下,表格将是一个数据透视表:id,user_id,option_id – Cudos 2010-01-07 19:21:38
@Cudos:您可以使用单独的表格轻松获得结果。查看我上面添加的查询示例。 – Guffa 2010-01-07 19:36:48
@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