【发布时间】:2012-11-29 17:08:33
【问题描述】:
我正在尝试压缩以下查询,该查询可能具有基于 Web 表单字段的无限选项。用户可以输入由逗号分隔的尽可能多的标题关键字。所以我的查询将像下面这样构造,带有无限的参数:
"SELECT title FROM titles WHERE
title LIKE '%blue%'
AND
title like '%red%'
AND
title like '%green%'
AND
title like '%yellow%'
...";
看看这个链接,MySQL LIKE IN()?,它展示了一个使用正则表达式的好例子,但它使用的是“OR”。
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
使用“AND”的等价物是什么?比如在准SQL中:
SELECT * from titles WHERE title REGEXP 'blue && red && green && yellow';
【问题讨论】:
-
如果您将关键字拆分到一个单独的表中并且只需要在
SELECT title_id FROM title_keywords WHERE keyword IN (?,?,...) GROUP BY title_id HAVING COUNT(*)=?检查 N 行是否与 N 个关键字匹配,这会容易得多。 -
Tadman:您的建议不起作用,因为使用“IN”太具体了。我需要它来使用通配符。例如,有人可能想要搜索“yell”,它应该会选择“yellow”。使用“IN”意味着它专门选择了“yell”而不是“yellow”。
-
正则表达式实际上并没有你想象中的“AND”。正则表达式中的所有内容本质上都是“AND”在一起的,除非明确设为可选,或者在一组中给出了替代列表(使用“|”)。这可以使用正则表达式来完成,但除非搜索选项位于标题中可预测的位置(例如,蓝色、红色、绿色和黄色总是以特定顺序出现在标题中),否则表达式将非常复杂。假设您的标题内容结构不合理,我认为您当前的解决方案很好。
标签: mysql regex full-text-search sql-like