【问题标题】:Matching similar lists in mysql+php匹配mysql+php中的相似列表
【发布时间】:2015-05-05 10:00:02
【问题描述】:

我有 2 张桌子, 第一个是播放列表,其中包括标题、作者和日期信息。 另一个表用于曲目,包含艺术家、歌曲名称、专辑(等)、播放列表 ID、流行度列。

我想以相似百分比显示特定播放列表的相似播放列表。

想要的结果是这样的;

  • 播放列表 #4 %70 类似于播放列表 #12
  • 播放列表 #4 %62 类似于播放列表 #9
  • 播放列表 #4 %35 类似于播放列表 #12
  • 播放列表 #4 %10 类似于播放列表 #210

我尝试过 solr,但我最近发现了 SOLR,我迷失在其中。有没有办法在mysql中做到这一点?

我唯一关心的是性能。可以有数千个播放列表。 ps:一个播放列表最少有5个最多10个项目/曲目。

【问题讨论】:

  • 您能否详细说明您的结果应该是什么样子。一个包含期望结果的表格以及包含您的数据库测试内容的表格将很高兴看到并且可以更轻松地为您提供帮助。..
  • 当然,@EdwinKrause 问题已更新。

标签: php mysql search solr full-text-search


【解决方案1】:

您可以将tracks 表连接到自身,然后按播放列表分组,得出您自己的相似度指标——例如:

SELECT   t1.playlistid, t2.playlistid,
         (
           1/COUNT(DISTINCT t1.artist, t1.song_name)
         + 1/COUNT(DISTINCT t2.artist, t2.song_name)
         )
         * SUM(t1.artist = t2.artist AND t1.song_name = t2.song_name)/2 similarity
FROM     tracks t1 JOIN tracks t2 ON t2.playlistid > t1.playlistid
GROUP BY t1.playlistid, t2.playlistid

这应该给出每个播放列表的曲目出现在另一个播放列表中的平均百分比(artistsong_name):因此,如果两个播放列表包含完全相同的曲目,则为 100% 相似度,如果没有则为 0% 相似度出现在两个播放列表中的曲目。

【讨论】:

  • 谢谢,这太棒了,但我忘了提到我需要特定播放列表的结果。
  • @siniradam:您是否无法相应地调整我的答案?这应该不是很困难(如果你做不到,你可能应该通过一个关于 SQL 的快速初学者教程)。
  • 当然我已经更新了,我刚才提到了。谢谢你。选择 t1.playlistid, t2.playlistid, ( 1/COUNT(DISTINCT t1.singer, t1.singer) + 1/COUNT(DISTINCT t2.singer, t2.singer) ) * SUM(t1.singer = t2.singer AND t1 .singer = t2.singer)/2 相似度 FROM 曲目 t1 加入曲目 t2 ON t2.playlistid > t1.playlistid WHERE t1.playlistid = 1 GROUP BY t1.playlistid, t2.playlistid
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2022-01-03
相关资源
最近更新 更多