我有一个包含mytext的列表,其中包含句子。
我想按任意顺序搜索有两个单词的句子,如“我的”“学校”。
我想要的结果是
牛津是我的学校
我的名字是kk school is jes
等
答案 0 :(得分:2)
查询:
SELECT *
FROM mytable
WHERE mycolumn LIKE "%my%"
and mycolumn LIKE "%school%";
还会返回如下句子:
但我们不想要它们。
你可以试试这个:
SELECT *
FROM mytable
WHERE mycolumn regexp ' my |^my | my$'
and mycolumn regexp ' school |^school | school$'
但是如果在列mycolumn中你有句话:
你应该考虑增加另一个条件:
SELECT *
FROM mytable
WHERE mycolumn regexp ' my |^my | my$'
and mycolumn regexp '[^a-zA-Z]school[^a-zA-Z]|^school | school$'
答案 1 :(得分:1)
如果你正在使用InnoDB表(你可能也是),你可以使用LIKE语句:
SELECT * FROM mytable WHERE mycolumn LIKE "%my%"
OR mycolumn LIKE "%school%";
对于全文搜索,更好的解决方案是使用针对此类目的进行优化的专用搜索引擎 - 例如elasticsearch。
答案 2 :(得分:0)
您可以使用FULLTEXT搜索。
全文搜索基于FULLTEXT索引,可以仅为MyISAM表创建,也仅为TEXT列和非BINARY CHAR和VARCHAR列创建。
FULLTEXT搜索不区分大小写。这是因为可以使用FULLTEXT索引的列类型的结果。
在你的情况下:
SELECT * FROM mytable WHERE MATCH(mycolumn)AGAINST('my school');
答案 3 :(得分:0)
您可以使用
SELECT * FROM table1 WHERE mycolumn REGEXP '(?=.*\bmy\b)(?=.*\bschool\b)';
(?=
,这是一个积极的展望。它与模式匹配而没有消耗字符
.*
可以匹配任意数量的任意字符
\b
与单词边界匹配
You can read more about this here
and here
这是一种不错的方法,因为您可以添加新单词,而只需添加更多积极的前瞻,例如:
SELECT * FROM table1 WHERE mycolumn REGEXP '(?=.*\bmy\b)(?=.*\bspecial\b)(?=.*\bschool\b)';
(要在HeidiSQL等某些应用中对其进行测试,可能需要使用\来转义\)