【问题标题】:Selecting rows based upon a search string or any of its synonyms根据搜索字符串或其任何同义词选择行
【发布时间】:2013-11-01 00:16:45
【问题描述】:

我需要一些帮助...

我有 2 个表,一个包含用户徒手输入的描述字段,第二个表由 2 列组成,第一个是组名,第二个是同义词列表。因此,例如,我可能在名为 A 的组中的同义词表中有三行,其中包含同义词“Leaflet”、“Brochure”、“Hand Bill”。

我需要做的是返回第一个表中的所有行,其中 ItemDescription 列包含查询变量的任何同义词,可能是“传单”。

所以这应该给我所有在长描述字段中包含“传单”、“小册子”或“手帐单”字样的行。

我只能在 ItemDescription 字段仅包含要查找的实际单词的情况下执行此操作,实际上这是一个冗长的列,可能包含 50 或 60 个单词,其中任何一个都可能是搜索词之一或它的任何同义词。

一如既往地感谢所有帮助。 谢谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可能应该尝试使用LIKERLIKE 来匹配描述列。在这种情况下,您想要匹配多个备选方案,因此我将仅展示一个示例。

    假设我们有这个包含同义词的表。请注意,我们已将单词本身添加为同义词:

    +---------+-----------+
    | word    | synonym   |
    +---------+-----------+
    | leaflet | leaflet   |
    | leaflet | brochure  |
    | leaflet | hand bill |
    | skin    | skin      |
    | skin    | leather   |
    | skin    | hide      |
    +---------+-----------+
    

    你没有给出示例表,所以我发明了一个叫items的表:

    +---------+-------------------+-----------------------------------+
    | item_id | brief             | description                       |
    +---------+-------------------+-----------------------------------+
    |       1 | Diamond           | This brochure is glossy and shiny |
    |       2 | Halloween Special | A leaflet for the Halloween       |
    |       3 | Pumpkin           | This is just a Halloween pumpkin  |
    +---------+-------------------+-----------------------------------+
    

    现在,我们假设您要查找描述中包含“leaflet”同义词之一的所有行。以下查询完成了这项工作:

    SELECT * FROM items
     WHERE description RLIKE (
        SELECT
           CONCAT('.*(', GROUP_CONCAT(synonym SEPARATOR '|'), ').*')
          FROM synonyms
         WHERE word = 'leaflet'
         GROUP BY word
      );
    

    内部选择创建一个匹配同义词之一的正则表达式,外部选择将此正则表达式应用到我们items 表的description 列。

    【讨论】:

      【解决方案2】:

      感谢您的反馈。我找到了满足我的 SQL 需求的答案:

      SELECT  *
      FROM    MainTable a
      WHERE   EXISTS
              (
              SELECT  1
              FROM    (
                      Select concat('%',Synonym,'%') As cond
                      From synonyms
                      Where Synonym Like '%SearchString%'
                      OR ListRef = (  Select ListRef 
                                      From synonyms
                                      Where Synonym Like '%SearchString%')
                      ) с
              WHERE   a.Description LIKE cond
              )
      OR ItemDescription Like '%SearchString%'
      

      如果没有最后的 OR,我只会返回同义词表中存在某些内容的行,用于我的搜索字符串,使用 OR 它还会返回所有通过同义词找不到的直接匹配项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        相关资源
        最近更新 更多