0

助けてください...

2 つのテーブルがあり、1 つはユーザーがフリーハンドで入力する説明フィールドを含み、2 番目のテーブルは 2 つの列で構成され、最初はグループ名で、2 番目は類義語のリストです。たとえば、類義語「リーフレット」、「パンフレット」、「手形」を含むグループ A の類義語テーブルに 3 つの行があるとします。

私がする必要があるのは、ItemDescription 列に「リーフレット」である可能性のあるクエリ変数の同義語が含まれている最初のテーブルからすべての行を返すことです。

したがって、これにより、詳細な説明フィールドの任意の場所に「リーフレット」、「パンフレット」、または「ハンドビル」という単語を含むすべての行が表示されます。

ItemDescription フィールドに検索対象の実際の単語のみが含まれている場合にのみこれを行うことができました。実際には、これは 50 または 60 の単語を含む長い冗長な列であり、そのいずれかが検索単語の 1 つまたはそのいずれかである可能性があります。同義語。

いつものようにすべての助けを感謝して受け取りました。ありがとう。

4

2 に答える 2

0

おそらく、説明列を使用するLIKEか、一致させるようにしてください。RLIKEこの場合、いくつかの選択肢を一致させたいので、例を示します。

シノニムを含むこのテーブルがあると仮定しましょう。単語自体を同義語として追加したことに注意してください。

+---------+-----------+
| 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  |
+---------+-------------------+-----------------------------------+

ここで、説明に「リーフレット」のシノニムの 1 つを含むすべての行を探したいとします。次のクエリはジョブを実行します。

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

内側の選択はシノニムの 1 つに一致する正規表現を作成し、外側の選択はこの正規表現をテーブルのdescription列に適用しitemsます。

于 2013-10-31T07:31:36.780 に答える
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 に答える