【问题标题】:How to compare part of string against large database in mysql如何将部分字符串与mysql中的大型数据库进行比较
【发布时间】:2016-03-08 13:13:54
【问题描述】:
  1. 我有一个 mysql 表,其中有一列域名(大约 10 万行)

例子:

ID    Domain_Name
 1    AnotherOlataxi.xom
 2    goodlolita.com
  1. 我还有几个表包含来自多种不同语言的单词,例如英语单词、法语单词等。

例子:

ID    Language   Word 
1     en         good
2     en         taxi
3     fr         ola

我想将每个域与语言表进行比较并查找单词和语言。

示例: 我应该得到一个单词和语言的列表。 如果我运行域 anotherolataxi.com ,它应该像这样返回

Array(
 'another'=>'en',
 'ola'   => 'fr',
 'taxi' =>'en'
)

我怎样才能得到这个结果以及如何在不影响性能的情况下比较这些大表?

【问题讨论】:

  • 这种方式唯一的问题是,匹配只能在纯字符匹配的基础上进行,找到的词是否真的在域名内,无法完全判断。例如,如果我只看字符序列,AnotherOlataxi 也包含“英雄”一词。如果您的单词列表中有该单词,那么即使该单词实际上并不存在,也会有匹配项。
  • 是的。这是一个有效的观点。但是有没有办法像第一个匹配的单词一样将凝视的一部分切成“另一个”。所以它将从字符串中删除,然后“OlaTaxi”将在那里
  • 这很难。让我们假设“ano”是一种语言中的有效词。您如何确定是否应该首先匹配“ano”并将其从域名中删除,还是使用“another”?
  • 您将面临的另一个问题是,当您在多种语言中使用相同的单词时。它们可能发音不同,可能意味着完全不同的东西,但它们的拼写是相同的。例如,“ola”不仅仅是一个法语单词,也是西班牙语。您如何决定为域名中的单词选择哪种语言?

标签: php mysql sql database


【解决方案1】:

您可以使用like 执行此操作。它效率不高,但它确实可以满足您的需求:

select d.*, w.*
from domains d join
     words w
     on d.domain_name like concat('%', w.word, '%');

对于单个域,性能应该不会太差。您可以添加where 子句:

where d.id = 1

例如。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多