【问题标题】:How to return rows in one table whose field contains a string from any row in another table?如何返回一个表中的行,其字段包含另一个表中任何行的字符串?
【发布时间】:2012-11-07 13:51:04
【问题描述】:

我在 MySQL 5.6 中有如下表结构:

CREATE TABLE `dictionary` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `word` varchar(80) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `word` (`word`)
) ENGINE=InnoDB;

CREATE TABLE `sentences` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sentence` varchar(254) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `sentencefulltext` (`sentence`)
) ENGINE=InnoDB;

我想返回包含字典中任何单词的所有句子。我真的不关心单词边界,它可以是一个基本的子字符串。

全文 MATCH AGAINST 似乎只适用于字符串,而不是从另一个表中选择。至于 LIKE 和 REGEXP,它们似乎需要很长时间,因为我的字典中有大约 500k 行句子和 50k 行单词。

一种选择是在程序中逐行遍历字典并在每一行上调用一个 select,但我宁愿在单个 SQL 语句中执行此操作。

如果有人有任何想法,请分享。

谢谢!

【问题讨论】:

    标签: mysql join full-text-search match


    【解决方案1】:

    试试这样的 -

     SELECT *
          FROM `sentences`,'dictionary'
         WHERE INSTR(word,''+sentence+'') > 0
    

    当您将 like 与 % 符号一起使用时 - 没有索引,这就是它太慢的原因,因此您可能需要全文搜索:

    http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

    【讨论】:

    • 这些字段的顺序似乎有误。使用以下 SQL 处理一小部分数据,我让它的工作速度比 LIKE 快一点:SELECT * FROM `sentences`,`dictionary` WHERE INSTR(sentence,word) > 0; 但是,对于大数据集,这需要很长时间。
    • 还有人有什么想法吗?
    • 检查我上面的编辑,喜欢和 instr 总是会很慢 - 可能会考虑重新设计表格,这样你就不必执行类似的操作。我还没有尝试过“IN”,但我认为它也会很慢
    • 我从全文搜索开始,但无法在 match against 子句中引用字典表,只能使用文本字符串。如果我能这样做就完美了:SELECT * FROM `sentences`,`dictionary` WHERE MATCH `sentence` AGAINST(`word`);
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 2011-06-04
    • 2012-11-21
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多