2017-11-15 7 views
0

SQLを使用した単純な検索機能に取り掛かりました。 GROUP_CONCATを使用して、すべてのキーワードを単一の行に配置します。キーワードはカテゴリから取得されます。mysqlと一致するグループを連結するグループ

この例では、すべての列があるわけではありません。私は

SELECT 
    p.id as id, 
    p.title as title, 
    p.title as company, 
    GROUP_CONCAT(DISTINCT cat.title SEPARATOR " ") as keywords, 
    FROM products p 
    JOIN product_categories pc ON p.id = pc.product_id 
    JOIN categories cat ON pc.category_id = cat.id 
    JOIN companies co ON p.company_id = co.id 
WHERE MATCH (p.title) AGAINST ("Test") 
OR MATCH (co.title) AGAINST ("Test") 
GROUP BY p.id 

keywordskeyword1 keyword2 keyword3のようなものが含まれていることを削ってきました。

上記のSQLが動作しています。しかし、私は仮想値keywordsの値を使ってMATCH AGAINSTを使うことはできません。

私はこれを追加するために、私は醜い回避策と思われるものについて読んだ:

HAVING keywords LIKE "%keyword1%" 

LIKEは、おそらく遅く、持つことは、私を使用することはできませんかそこらでHAVING、GROUP BYの後であるため、この場合はWHEREを上書きします。

理想的には、keywordsのMATCH AGAINSTも使用したいと思います。では、私の選択肢は何ですか?

  • 何らかの仮想テーブルですか?
  • サブクエリ?
  • 他に何かありますか?

おそらく、理解するためのサンプルコードが必要です。

答えて

1

これは、あなたが尋ねた質問に答えていないが、私は、クエリのWHERE句に、この条件を追加すると思う:

OR EXISTS (SELECT 1 
        FROM categories k 
       WHERE k.id = pc.category_id 
        AND k.title IN ('Test1','Test2') 
      )  

場合GROUP BYは、GROUP_CONCATからの復帰をスキャンする必要がなくなる前に、仕様は、カテゴリタイトルが指定された検索語の1つと一致する行を返すことです。実際に結果セットに派生keywords列を返す必要がない場合は


、私はGROUP BYを避けるだろう。

SELECT p.id AS id 
    , p.title AS title 
    , p.title AS company 
    FROM products p 
    JOIN companies co 
    ON co.id = p.company_id 
WHERE MATCH (p.title) AGAINST ('Test') 
    OR MATCH (co.title) AGAINST ('Test') 
    OR EXISTS (SELECT 1 
        FROM categories k 
        JOIN product_categories pc 
        ON pc.category_id = k.id 
       WHERE pc.product_id = p.id 
        AND k.title IN ('Test1','Test2') 
      ) 
ORDER BY p.id 
+0

はい、これまでのところそれは速かったようです(4000製品)。何らかの理由でGROUP_CONCATは検索された単語だけを返しますが、コードには何も関係ないと思います。アウトプットにもカテゴリを持たせるといいでしょう。しかし、それは奇妙です。 –

+1

'k.title IN'はMATCH述部' MATCH(k.title)AGAINST 'Test' 'で置き換えてください。しかし、元のクエリ(質問に表示されている)に 'OR EXISTS'を追加することは、' GROUP_CONCAT'の 'cat.title'に対して返される行に影響を与えるとは思わないでしょう(答えの2番目のクエリdoesn 'cat.title'は返されません;これはjoin' categories'テーブルがないので利用できません。私はこの答えが尋ねられた質問に答えるのではなく、別の質問に答えることを知っています。 – spencer7593

関連する問題