【问题标题】:MySQL word+word searchMySQL单词+单词搜索
【发布时间】:2011-06-21 13:21:19
【问题描述】:

我有两个表:字典、名称。 两个表都有大量的行(比如 200.000)。

字典中的列:id、word

名称中的列:id、名称

我需要选择 Dictionary.word+Dictionary.word 的所有名称(对于所有变体,类似于同一列的串联)

另外,我需要快速查询,而不是需要几个小时才能加载的内容... 关于这个速度 - 如果要求将列/单词比较设置为“min 5 chars”之类的东西,我会很满意......

【问题讨论】:

    标签: mysql search select concatenation


    【解决方案1】:

    这应该可行:

    SELECT `N`.`name`
    FROM `Names` `N`
    INNER JOIN `Dictionary` `D` ON `N`.`name` = CONCAT(`D`.`word`, `D`.`word`);
    

    新查询:

    SELECT `N`.`name`
    FROM `Names` `N`
    INNER JOIN `Dictionary` `D`
    INNER JOIN `Dictionary` `D1`
    WHERE `N`.`name` = CONCAT(`D`.`word`, `D1`.`word`);
    

    【讨论】:

    • @Darko:请确保您在 Names.nameDictionary.word 列上拥有正确的索引
    • 但是,所有这些答案仅给出由相同单词+单词组成的名称的结果......仅选择了 JohnJohn 和类似的名称。我也需要 JohnHouse……你懂我的意思吗?
    【解决方案2】:

    这会尝试使用 d.word 上的索引来获得答案。

    SELECT *
    FROM Names n
    JOIN Dictionary d1
    JOIN Dictionary d2
    WHERE 
        LEFT(n.name, LENGTH(n.name)/2) = d1.word
    AND RIGHT(n.name, LENGTH(n.name)/2) = d2.word
    AND n.name = CONCAT(d1.word, d2.word);
    

    【讨论】:

    • 工作正常。但是,所有这些答案只给出由相同单词+单词组成的名称的结果......只选择了 JohnJohn 和类似的名称。我也需要 JohnHouse……你懂我的意思吗?
    • 哦哦哦。没有意识到这就是你想要的。 1 秒。
    【解决方案3】:

    完全不确定速度:

    SELECT n.*
    FROM Names AS n
      JOIN Dictionary AS d1
        ON n.name LIKE CONCAT(d1.word, '%')
      JOIN Dictionay AS d2
        ON d1.id <= d2.id
    WHERE n.name = CONCAT(d1.word, d2.word))
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT * FROM `Names` `n`
      INNER JOIN `Dictionary` `d`
      ON `d`.`word` IS NOT NULL
      AND (`n`.`name` LIKE CONCAT(`d`.`word`,`d`.`word`));
      

      更新:

      SELECT * FROM `Names` `n`
      INNER JOIN `Dictionary` `d1`
      INNER JOIN `Dictionary` `d2`
              ON `n`.`name` = CONCAT(`d1`.`word`,`d2`.`word`) 
              OR `n`.`name` LIKE CONCAT(`d1`.`word`,`_%`) 
              OR `n`.`name` LIKE CONCAT(`d2`.`word`,`_%`)
      

      【讨论】:

      • 但是,所有这些答案仅给出由相同单词+单词组成的名称的结果......仅选择了 JohnJohn 和类似的名称。我也需要 JohnHouse……你懂我的意思吗?
      • 我认为这个查询也会匹配“John”
      • @Abhay:是的,他就是这么问的。
      • @Shef:我认为 Darko 需要 word+word,例如JohnJohn 或 JohnHouse,从标题中也可以看出。我不确定他是否也需要“约翰”
      • @Abhay, @Darko:添加了_%,它将匹配John + 一个字符。如果只是John,则不匹配。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2015-07-13
      • 2015-05-22
      • 2013-12-18
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多