在标记视频系统上寻找有关“相关视频”查询的建议

时间:2008-12-20 19:10:30

标签: php mysql

我运行了一个小型视频网站,在实际视频页面上有一条类似于大多数视频方面的“相关视频”(例如YouTube),目前我所做的就是随机选择其中一个标签并查找具有相同标签的其他视频。毫不奇怪,这不是一个很好的方法,因为有些标签很模糊,有些视频标签错误。

当前查询的示例:

SELECT video_name FROM videos INNER JOIN videotags ON videos.id=videotags.video_id INNER JOIN tags ON tags.id=videotags.tag_id WHERE tag_name='x' AND videos.id<>'y' LIMIT 5

其中x是当前视频中的任何一个标记,y是当前视频的ID。 (P.S.我正在使用参数化查询,不用担心)

我只是好奇你们将如何处理这个问题,或许最好加入类似的视频标题?

以下是我的数据库表的设置方式:

VIDEOS TABLE
------------
video_id [PK,auto_increment] int(11)
video_name varchar(255)

TAGS TABLE
----------
tag_id [PK,auto_increment] int(11)
tag_name varchar(255)

VIDEOTAGS TABLE
---------------
tag_id [PK,FK] int(11)
video_id [PK,FK] int(11)

视频表中显然有更多列,但这只是说明了双方自动递增主键的简单多对多关系

该站点基于PHP构建,带有MySQL数据库,但这无关紧要:)

编辑:有一些关于走下有机路线的谈话,所以我想我会发布与视频观看次数和视频评级有关的其他两个与半相关的表格。现在请注意,由于隐私问题,我没有打算在视频视图表中专门添加更多列(是的,我知道我将IP存储在评级表中)

VIDEOVIEWS TABLE
----------------
video_id [FK] int(11)
view_time datetime

VIDEORATINGS TABLE
------------------
video_id [PK,FK] int(11)
ip_address [PK] varchar(15)
rating int(1)
rate_time datetime

2 个答案:

答案 0 :(得分:4)

此查询应返回与您的给定视频(v1)具有共同标签的视频ID(v2),按照共同标签数量的降序排列。

SELECT v2.video_id
FROM VideoTags AS v1
  JOIN VideoTags AS v2
  USING (tag_id)
WHERE v1.video_id = ?
  AND v1.video_id <> v2.video_id
GROUP BY v2.video_id 
ORDER BY COUNT(*) DESC;

答案 1 :(得分:1)

非常有趣的问题。

这只是大声思考,但我能想到的一些选择是:

1)使用所有标签 - 例如,想象查看具有该视频所具有的每个标签的视频列表。根据它们出现的列表数量计算所生成的视频列表,即与该视频共有多少个标签的数量。有更多标签的人可能会“更相关”。

(我不是建议你在现实中做多个查询,只是试图解释我的想法......有一个比我更好的SQL-fu的人可能会想出一个单一的查询来做到这一点。也许你另外还可以按人气或其他信息排序。

2)尝试使用一种能让相关视频自然出现的算法,一个亚马逊购买此产品的人也买了这个。例如,如果您跟踪查看内容的人,则可以设计生成此类列表的查询。