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
keywords
がkeyword1 keyword2 keyword3
のようなものが含まれていることを削ってきました。
上記のSQLが動作しています。しかし、私は仮想値keywords
の値を使ってMATCH AGAINSTを使うことはできません。
私はこれを追加するために、私は醜い回避策と思われるものについて読んだ:
HAVING keywords LIKE "%keyword1%"
LIKEは、おそらく遅く、持つことは、私を使用することはできませんかそこらでHAVING、GROUP BYの後であるため、この場合はWHEREを上書きします。
理想的には、keywords
のMATCH AGAINSTも使用したいと思います。では、私の選択肢は何ですか?
- 何らかの仮想テーブルですか?
- サブクエリ?
- 他に何かありますか?
おそらく、理解するためのサンプルコードが必要です。
はい、これまでのところそれは速かったようです(4000製品)。何らかの理由でGROUP_CONCATは検索された単語だけを返しますが、コードには何も関係ないと思います。アウトプットにもカテゴリを持たせるといいでしょう。しかし、それは奇妙です。 –
'k.title IN'はMATCH述部' MATCH(k.title)AGAINST 'Test' 'で置き換えてください。しかし、元のクエリ(質問に表示されている)に 'OR EXISTS'を追加することは、' GROUP_CONCAT'の 'cat.title'に対して返される行に影響を与えるとは思わないでしょう(答えの2番目のクエリdoesn 'cat.title'は返されません;これはjoin' categories'テーブルがないので利用できません。私はこの答えが尋ねられた質問に答えるのではなく、別の質問に答えることを知っています。 – spencer7593