2017-06-02 42 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版本? –