繁体   English   中英

在B栏(MySQL)的“文本”中找到准确的单词形式A栏

[英]Find a exact word form column A within Text in Column B (MySQL)

我有2个表,并尝试消除表1中的所有条目(每行多个单词),其中包含表2中的条目之一。表2中的这些单词可以位于表1的字符串中。

它应该找到类似以下内容:“这里的大房子”或“大房子”中的“房子”

它不应该找到这样的东西:“房子”中的“房子”

我试图像这样使用定位功能:

CREATE TABLE `test`
AS (
  SELECT
    `table1`.`term1`,
    `table2`.`term2`
  FROM `table1`,`table2`
  WHERE
    locate(concat(' ',`table2`.`term2`,' '), concat(' ',`table1`.`term1`,' '))
);

问题是:它找到了一些但不是全部,而且我看不到背后的逻辑为什么它不能对所有东西都起作用。

如果您要查找的单词周围有标点符号,则无法进行匹配。

您可以用空格 替换字段中的所有标点符号

但是,我认为一个更简洁的解决方案是一个正则表达式

CREATE TABLE test
AS
SELECT table1.term1, table2.term2
FROM table1, table2
WHERE table1.term1 REGEXP CONCAT('(^|[^A-Za-z]])',table2.term2,'([^A-Za-z]|$)');

(^|[^A-Za-z])表示不是字段开始,还是不是AZ或az。
([^A-Za-z]|$)表示不是AZ或az或字段结尾。

SQLFiddle

编辑:

尽管上面的内容很漂亮,但并不是特别有效。 (小测试中为140 ms

效率更高:( 80 ms ,对于适当的数据可能会更好)

SELECT term1, term2
FROM table1, table2
WHERE term1 LIKE CONCAT('%',term2,'%')
  AND term1 REGEXP CONCAT('(^|[^A-Za-z])',term2,'([^A-Za-z]|$)');

效率更高:8 ms )(出于某些奇怪的原因,MySQL似乎不能很好地执行正则表达式)

SELECT COUNT(*)
FROM table1, table2
WHERE term1 LIKE CONCAT(term2,' %')
   OR term1 LIKE CONCAT(term2,',%')
   OR term1 LIKE CONCAT(term2,'.%')
   OR term1 LIKE CONCAT(term2,';%')
   OR term1 LIKE CONCAT('% ',term2,' %')
   OR term1 LIKE CONCAT('% ',term2,',%')
   OR term1 LIKE CONCAT('% ',term2,'.%')
   OR term1 LIKE CONCAT('% ',term2,';%')
   OR term1 LIKE CONCAT('% ',term2)

效率略高:4 ms

SELECT COUNT(*)
FROM table1, table2
WHERE CONCAT(' ', REPLACE(REPLACE(REPLACE(term1, ',', ' '), '.', ' '), ';', ' '), ' ')
        LIKE CONCAT('% ',term2,' %')

您可能要在上面再添加几个字符。

SQLFiddle

请注意,以上内容大部分取决于数据,在某些情况下某些效率可能更高,而在另一些情况下则更差(但正则表达式可能会落后)。

更有效率吗?

全文索引+搜索

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM