2017-06-02 40 views
1

我有多個關鍵字不同的項目,並且希望在項目的詳細信息頁面上顯示類似項目(基於關鍵字)。通過關鍵字的類似條目

所以一個項目有例如關鍵詞:蘋果,紅色,圓形,新鮮,水果。

我想從數據庫中選擇具有所有/某些/這些關鍵字之一的項目......按照匹配關鍵字(相關性/對應關係)的數量排序。

有沒有辦法在普通的SQL語句中做到這一點?喜歡的東西:

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

編輯1:

的關鍵字保存在數據庫中的字段像JSON格式的字符串:

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

編輯2:

我已將數據庫結構更改爲保存關鍵字的2個表格。

關鍵字:id | keyword

keyword_relations:keyword_id | image_id

至於我可以看到我只需要keyword_relations表得到類似的圖像image_ids。

我想是這樣的:

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

但它返回 「操作數應包含1列(S)」

+0

什麼'LIKE'和'或'? – Swellar

+0

假設您已經熟悉規範化,請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-tobe -a-very-simple-sql-query – Strawberry

+0

@Swellar我認爲LIKE和OR會因爲子串排序和所有排列而變得非常詳細。 – mickmackusa

回答

0

如何使用where in

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

它等於:

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版本? –