Php 寻求关于“a”的建议;相关视频“;带标签视频系统的查询

Php 寻求关于“a”的建议;相关视频“;带标签视频系统的查询,php,mysql,Php,Mysql,我经营一个小型视频网站,在实际的视频页面上有一条“相关视频”,与大多数视频页面(如YouTube)类似,目前我所做的就是随机选取其中一个标签,并查找具有相同标签的其他视频。毫不奇怪,这不是一个很好的方法,因为有些标记非常模糊,有些视频标记错误 当前查询的示例: SELECT video_name FROM videos INNER JOIN videotags ON videos.id=videotags.video_id INNER JOIN tags ON tags.id=videotags

我经营一个小型视频网站,在实际的视频页面上有一条“相关视频”,与大多数视频页面(如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
显然,videos表中有更多的列,但这只是说明了简单的多对多关系,两侧的主键都是自动递增的

该网站是基于PHP和MySQL数据库构建的,但这并不重要:)

编辑:有人说要走有机路线,所以我想我会发布另外两个与视频视图和视频评级半相关的表格。现在请注意,由于隐私问题,我无意在视频视图表中专门添加更多列(是的,我知道我在评级表中存储IP)


非常有趣的问题

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

1) 使用所有标记-例如,想象一下查询包含此视频所做标记的视频列表。生成一个视频列表,该列表按它们出现在列表中的数量排序,即它们与此视频共有多少标签的数量。有更多共同标签的可能是“更相关的”

(我不是建议你在现实中进行多个查询,只是想解释一下我的想法……拥有比我更好的SQL fu的人可能会提出一个查询来实现这一点。也许你还可以根据人气或其他信息进行排序)


2) 尝试使用一种算法,让相关视频自然出现,一个la amazon“买了这个的人也买了这个”。例如,如果您跟踪谁观看了什么,您可以设计一个查询来生成这样一个列表。

此查询应返回与给定视频(v1)具有相同标记的视频(v2)的id,按相同标记数的降序排列

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;
选择v2.video\u id
从视频标签到v1
将VideoTags作为v2加入
使用(标签id)
其中v1.video_id=?
和v1.video_id v2.video_id
按v2.video\u id分组
按计数排序(*)说明;

想法一基本上就是我所想的,但我不知道如何将其转换为SQL。正如您所说,我的SQL fu不够强大。好吧,这是一个好地方,可以提问……也许可以作为一个单独的SQL问题,询问关于特定查询的想法,并将其链接到这个问题?但我认为这个问题也值得保留,这是一个很好的问题。您还可以添加一个限制5(例如,将相关视频的数量限制为5),并将最后一行更改为ORDER BY COUNT(*)DESC,RAND(),以便在每次分数相同时随机获取视频。在完成任务时给出此最佳答案,希望得到一些其他的意见,但是什么呢
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
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;