0

我需要一些帮助,请...

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

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

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

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

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

4

2 回答 2

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,它还会返回通过同义词找不到的所有直接匹配项。

于 2013-10-31T16:16:45.783 回答
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表的列。

于 2013-10-31T07:31:36.780 回答