我的实体表和标记通过另一个表(多对多关系)绑定到它。
我选择了一个实体,我的目标是找到一组具有尽可能多相似标记的实体。此集合必须按“相似性”排序,即每个实体与所选实体共享的标记数量。如果标签具有相同的id,则它们是相似的。
我想知道是否有一个优雅和快速的方法来做单一的查询。
我现在看到的唯一解决方案是获取所有标记实体关系并计算它们在我的应用程序中的相似性,然后再进行另一个数据库查询以选择我计算的内容,但它看起来不太优雅。
数据库结构:
实体
身份证件
…
标签
身份证件
名称
实体标记
实体ID
标记ID
更新:mysql的最终解决方案。
所以我有画的桌子,标签和画的标签关系。此查询获取类似的绘画及其与先前选定绘画的“相似性索引”。
SELECT site_painting.*, Count(tr.tag_id) as similarity
From site_painting_tag_relation as tr
Inner Join site_painting_tag_relation as tr2 ON ( tr2.tag_id = tr.tag_id and tr2.painting_id = :id )
Left join site_painting on site_painting.id=tr.painting_id
Where tr.painting_id <> :id
Group By tr.painting_id
Having Count(*) > 0
Order By Count(*) DESC, tr.painting_id limit 1
最佳答案
好的,关于数据库结构的信息有很大帮助--
entity id ...
entity_tag entity_id tag_id
tag id name
让我们看看一些示例值--
entity
id=100
id=...
id=199
entity_tag
100, 3
100, 5
101, 1
102, 7
...
199, 3
199, 7
tag
id=1
id=...
id=10
所以如果我们把实体标签非标准化
100 3,5
101 1
102 7
199 3 7
相似指数为199
100 1 in common
101 0 in common
102 1 in common
199 self, no comparison
如果我说对了,我们想显示100和102是最高的,
努??
这里有一个sql--
可能有点像---
SELECT TOP 10
FROM
(SELECT
allET.EID,
Count(*) as Similarity
From entity_tag as allET
Left Join
(Select * From entity_tag Where EID = myEID ) as myET
On allET.TID = myET.TID
Where allET.EID <> myEID
Group By allET.EID
Having Count(*) > 0
Order By Count(*) DESC, allET.EID
)
关于sql - 从SQL数据库中选择具有相似标签(多对多关系)的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22470404/