我的实体表和标记通过另一个表(多对多关系)绑定到它。
我选择了一个实体,我的目标是找到一组具有尽可能多相似标记的实体。此集合必须按“相似性”排序,即每个实体与所选实体共享的标记数量。如果标签具有相同的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/

10-15 13:20