1

検索プールで無関係なタグを無効にすることで、ある種のスマート データ検索を行うアプリケーションに取り組んでいます。

たとえば、次の表が与えられた場合 (私の書式設定が不適切な場合は申し訳ありません):

    _id  |  _tagname
    1       A
    1       B
    1       C
    2       A
    2       B
    3       A
    4       B
    5       C
    6       D

ユーザーがタグAを選択した場合 (タグを選択するたびに以下が実行されます):

  1. タグに一致する ID を取得します -> 1、2、3が新しい検索プールになります
  2. タグBCを使用すると、ユーザーはタグをフィルタリングして ID 1を取得できるため、関連しないすべてのタグを非表示 -> D

TL;DR : これは私の現在のアプローチであり、現在結果を得るのに時間がかかりすぎるため、最適化する方法があるかどうか疑問に思っていました

SELECT _tagname FROM datatags WHERE 
(_tagname) NOT IN 
( SELECT _tagname FROM datatags WHERE 
_id IN (1,2,3)) 
GROUP BY _tagname

ありがとうございました!質問を投稿するのは初めてなので、お手柔らかにお願いします:)

編集:フォーマット

4

1 に答える 1

0

最終的に一緒に表示されるタグを探していますか、それとも奇妙なタグを本当に削除したいですか?

関連するタグを見つけるには 2 つの方法があります (またはまたは{ A, B, C }の戻り値、および の戻り値) 。ABC{ D }D

  • 相関サブクエリを使用します。

    SELECT DISTINCT _tagname 
    FROM   datatags 
    WHERE  _id IN (SELECT _id 
                   FROM   datatags 
                   WHERE  _tagname = ?)
    
  • 自己結合を使用します。

    SELECT DISTINCT b._tagname 
    FROM   datatags a 
           JOIN datatags b USING (_id) 
    WHERE  a._tagname = 'A' 
    

逆の場合 (特定のタグと一緒に表示されないタグ)、タグのセット全体と関連するタグの違いを見つけることができます。MySQL は をサポートしていませんMINUSが、関連のないタグを見つける 1 つの方法を次に示します。

  • 自己結合で相関サブクエリを使用します。

    SELECT _tagname 
    FROM   datatags 
           LEFT JOIN (SELECT DISTINCT _tagname 
                      FROM   datatags 
                      WHERE  _id IN (SELECT _id 
                                     FROM   datatags 
                                     WHERE  _tagname = ?)) a USING (_tagname) 
    WHERE  a._tagname IS NULL
    
于 2012-12-18T04:59:29.567 に答える