2010-11-13 91 views
99

我有这个MySQL查询。MySQL喜欢多个值

我有这个内容

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games 

为什么会出现这种类似的查询不起作用数据库字段? 我需要与运动或酒吧或两个领域?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%') 

回答

89

(a,b,c)列表仅适用于in。对于like,你必须使用or

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%' 
6

您的查询应该是SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

我的理解是,你存储在你的表,这是一个误解的一个领域的利益。你应该明确地有一个“兴趣”表。这样做的

+2

我认为它应该是'SELECT * FROM table WHERE find_in_set(interest,'sports,pub')',但是这种技术在大多数情况下可能会胜过正则表达式。 – 2017-09-14 04:02:06

+0

你是对的。我编辑了我的答案。 – 2018-01-23 09:54:42

234

比较快的方式:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%' 

是这样的:

WHERE interests REGEXP 'sports|pub' 

发现这个解决方案在这里:http://forums.mysql.com/read.php?10,392332,392950#msg-392950

更多REGEXP这里:http://www.tutorialspoint.com/mysql/mysql-regexps.htm

+28

+1,但运行时速度并不快,但按键速度更快。 – Johan 2011-09-27 09:39:48

+0

如果你传递一个未知数量的关键字作为字符串(a | b | c ...),那么如果你想要像这样使用正则表达式,唯一的方法就是使用正则表达式。 – frequent 2012-06-21 12:53:19

+0

你知道这是否可以通过子查询完成吗?假设我有一列我需要搜索的词,我如何用一个子查询替换'sports | pub'? – AdamMc331 2014-10-25 19:25:20

3

唐“T忘了,如果你的AND参数

筛选后,使用此功能使用括号:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%') 
25

为什么不试试REGEXP。试着这样说:

SELECT * FROM table WHERE interests REGEXP 'sports|pub' 
+1

这真的很不错。学到了新东西。谢谢,, – amrodelas 2016-06-20 09:35:06

+0

这应该是被接受的答案。 – Mark 2016-08-09 19:50:12

+0

感谢马克,但他们已经接受了另一个答案:) – 2016-08-10 07:02:51

1

像@Alexis Dufrenoy建议,查询可能在manualSELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

更多信息。