2017-06-02 11 views
1

私は異なるキーワードを持つ複数のアイテムを持っており、アイテムの詳細ページに類似アイテム(キーワードベース)を表示したいと考えています。キーワードで類似した商品

したがって、1つのアイテムは、apple、red、round、fresh、fruitなどのキーワードを持ちます。

これらのキーワードのすべて/いくつか/ 1つを含むアイテムをデータベースから選択して、一致するキーワードの数(関連性/対応性)でソートします。

プレーンなSQL文でこれを行う方法はありますか?以下のような何か:

SELECT id FROM images WHERE keywords MAGICSTATEMENTHERE 'apple|red|round|fresh|fruit' ORDER BY MATCHES LIMIT 10 

EDIT 1:

キーワードはのようなJSON形式の文字列としてデータベースフィールドに保存されます。

["abhauen","abheben","beflügelt","bunt","bunter"] 

EDIT 2:

Iデータベース構造をキーワードが保存されている2つのテーブルに変更しました。

キーワード:id | keyword

keyword_relations:keyword_id | image_id

限り、私は唯一類似イメージのimage_idsを取得するためにkeyword_relationsテーブルを必要と見ることができるように。

私はこのような何か試してみました:

SELECT image_id FROM keyword_relations WHERE keyword_id IN(SELECT * FROM keyword_relations WHERE image_id=" . $image->id . ") ORDER BY MATCHES" 

をしかし、それはwhere inの使用に関する

+0

何? – Swellar

+0

正規化に慣れている場合は、https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-beを参照してください。 -a-very-simple-sql-query – Strawberry

+0

@Swellar私はLIKEとORが、部分文字列の順序付けとすべての置換を考えるとひどく冗長になると思います。 – mickmackusa

答えて

0

方法 "オペランドは、1列(複数可)を含める必要があります" を返しますか?

`SELECT id FROM images WHERE keywords IN('apple','red','round','fresh','fruit') ORDER BY MATCHES LIMIT 10 ` 

それに等しいです: `LIKE`と` OR`について

SELECT id FROM images WHERE keywords = 'apple' OR keywords = 'red' OR keywords = 'round' OR keywords = 'fresh' OR keywords = 'fruit' ORDER BY MATCHES LIMIT 10

+0

キーワードフィールドに複数のキーワードがJSON形式の配列として含まれています。私は質問 –

+0

を更新しました。おそらく、より良いクエリを作成するために、データベース構造をキーワードテーブルとキーワードイメージの関係テーブルに変更する必要があります。 –

+0

どのMySQLバージョンを使用していますか? –

関連する問題