【问题标题】:MySQL Query to rank based on number of similar tagsMySQL Query 根据相似标签的数量进行排名
【发布时间】:2014-06-05 04:53:07
【问题描述】:

我希望有比我更高级的 MySQL 知识的人来帮助指导我如何执行以下操作。

假设我有表 #1,视频:

Video ID
Video Name etc

我也有表 #2,标签

Tag ID
Tag Name

我有第三张表,它将每个视频链接到一个或多个标签:

ID (primary and autoincremented)
Tag ID
Video ID

现在我可以使用上面结合 PHP 找到类似的视频(基于有多少视频共享最多标签),但这涉及到一些查询,我觉得可以做到仅通过 mysql 查询更优雅。我想浏览视频,并根据它们彼此共有的标签数量找到最相似的视频。

感谢任何帮助!

【问题讨论】:

  • 您能否提供输入数据和所需输出数据的样本?
  • 除了@TrippKinetics 询问的内容之外,请显示您当前正在使用的查询

标签: php mysql sql


【解决方案1】:

假设视频是“重力”,重力的 VIDEO_ID 是 4321。

SELECT COUNT(res.TAG_ID), res.VIDEO_ID
FROM tag_link_table res
  INNER JOIN tag_link_table target
    ON target.VIDEO_ID = 4321 AND res.TAG_ID = target.TAG_ID
GROUP BY res.VIDEO_ID
ORDER BY COUNT(res.TAG_ID) DESC

【讨论】:

  • Marlin 的查询是正确的,但有两点值得注意。第一,如果您想一次计算多个视频(例如 video_id = ?),这将是一个非常昂贵的查询。这是一个固有的组合问题。事实上,它本质上是一个 k 最近邻问题,我强烈建议不要在 SQL 中运行,除非您一次只需要看一个视频。如果是这种情况,请注意第二点:确保在 tag_link_table 上创建一个包含 TAG_ID 的索引(或者,更好的是,一个在 (VIDEO_ID ,TAG_ID) 上,一个在 TAG_ID 上)。
  • 是的,tag_link_table 肯定需要 VIDEO_ID 上的索引和 TAG_ID 上的另一个索引。
  • 我刚刚为 SqlFiddle 上的问题创建了一个模式,但 Marlin 的答案首先出现。所以,我在这里结合了查询和模式:sqlfiddle.com/#!2/318d5/3
  • 在 VIDEO_ID 上的索引和 TAG_ID 上的索引与 (VIDEO_ID, TAG_ID) 上的多列索引和 TAG_ID 上的另一个索引之间,我想我会在后面做……覆盖索引的好处没有索引合并。此外,您可以摆脱 tag_link_table 和 (VIDEO_ID, TAG_ID) 的 Pk 上的自动增量...节省一点空间并提高准确性。可能会稍微影响写入速度,但还不足以让我犹豫 Pk 这两列并删除自动增量一列。
  • 考虑索引多个字段很重要,因为太多的年轻程序员只索引一个字段。请理解,如果您在 (VIDEO_ID, TAG_ID) 上有索引,则数据库可以将其用作仅 VIDEO_ID 的索引。也就是说,如果DB需要VIDEO_ID上的索引,可以使用复合索引,因为VIDEO_ID在前,所以不会缺少VIDEO_ID索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2021-05-24
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多