根据搜索字符串或其任何同义词选择行

时间:2013-10-31 01:48:29

标签: mysql

我需要一些帮助...

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

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

所以这应该给我所有在长描述字段中包含“Leaflet”,“Brochure”或“Hand Bill”字样的行。

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

所有的帮助都一如既往地感激不尽。 感谢。

2 个答案:

答案 0 :(得分:0)

您应该尝试使用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
  );

内部选择创建与其中一个同义词匹配的正则表达式,外部选择将此正则表达式应用于description表的items列。

答案 1 :(得分:0)

感谢您的反馈。我找到了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它还会返回通过同义词找不到的所有直接匹配。