【发布时间】:2011-09-01 13:45:21
【问题描述】:
我必须使用这种格式where A operand B。 A是场;我希望 B 是 "text 1" 或 "text 2",所以如果 A 有像 "text 1 texttext" 或 "texttext 2" 这样的数据,查询就会有结果。
但是我该怎么写呢? MySQL是否支持类似的东西
where A contains ('text 1' OR 'text 2')? `
【问题讨论】:
标签: mysql
我必须使用这种格式where A operand B。 A是场;我希望 B 是 "text 1" 或 "text 2",所以如果 A 有像 "text 1 texttext" 或 "texttext 2" 这样的数据,查询就会有结果。
但是我该怎么写呢? MySQL是否支持类似的东西
where A contains ('text 1' OR 'text 2')? `
【问题讨论】:
标签: mysql
两种选择:
使用 LIKE 关键字以及字符串中的百分号
select * from table where field like '%a%' or field like '%b%'.
(注意:如果您的搜索字符串包含百分号,则需要对其进行转义)
如果您正在寻找比示例中指定的更复杂的字符串组合,您可以使用正则表达式 (regex):
有关如何使用它们的更多信息,请参阅 MySQL 手册:http://dev.mysql.com/doc/refman/5.1/en/regexp.html
其中,使用LIKE 是最常用的解决方案——它是标准SQL,并且是常用的。正则表达式不太常用,但功能强大得多。
请注意,无论您使用哪种选项,您都需要了解可能的性能影响。像这样搜索子字符串意味着查询必须扫描整个表。如果您有一个大表,这可能会导致查询速度非常慢,而且再多的索引也无济于事。
如果这对您来说是个问题,并且您需要一遍又一遍地搜索相同的内容,您可能更愿意执行类似的操作,例如在表中添加一个标志字段,指定字符串字段包含相关子串。如果您在插入或更新记录时保持此标志字段是最新的,您可以在想要搜索时简单地查询该标志。这可以被索引,并使您的查询更快。是否值得为此付出努力取决于您,这取决于使用 LIKE 时的性能有多差。
【讨论】:
select * from table where (field like '%a%' or field like '%b%')。如果您有其他 AND 子句,您的查询可能会像 SELECT * FROM TABLE WHERE (A = 1 AND B =2 AND C = 3) OR (D =4) 一样,这通常不是您想要的。
你可以这样写你的查询:
SELECT * FROM MyTable WHERE (A LIKE '%text1%' OR A LIKE '%text2%')
% 是一个通配符,这意味着它会搜索 A 列包含 text1 或 text2
【讨论】:
A operand B 格式。由于编程,这实际上是我必须使用的所有 3 个变量
我大部分时间都使用 LIKE 选项,它工作得很好。 我只想分享我使用 INSTR 函数的最新经验之一。不管是什么原因让我考虑这个选项,这里重要的是用途是相似的: instr(A, 'text 1') > 0 或 instr(A, 'text 2') > 0 另一种选择可能是: (instr(A, '文本 1') + instr(A, '文本 2')) > 0
我会选择 LIKE '%text1%' OR LIKE '%text2%' 选项...如果不是希望这个其他选项有帮助
【讨论】:
我是搜索摩托车尺寸的用户:
例如: Data = "轮胎循环尺寸 70 / 90 - 16"
我可以用“70 90 16”搜索
$searchTerms = preg_split("/[\s,-\/?!]+/", $itemName);
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$searchTermBits[] = "name LIKE '%$term%'";
}
}
$query = "SELECT * FROM item WHERE " .implode(' AND ', $searchTermBits);
【讨论】:
OR