我运行了一个小型视频网站,在实际的视频页面上有一条类似于大多数视频方面的"相关视频"(例如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
Run Code Online (Sandbox Code Playgroud)
其中x是当前视频中的任何一个标记,y是当前视频的ID.(PS我使用参数化查询不用担心)
我只是好奇你们将如何处理这个问题,或许最好加入类似的视频节目?
以下是我的数据库表的设置方式:
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)
Run Code Online (Sandbox Code Playgroud)
视频表中显然有更多列,但这只是说明了双方自动递增主键的简单多对多关系
该网站建立在带有MySQL数据库的PHP上,但这无关紧要:)
编辑:有一些关于走有机路线的谈话,所以我想我会发布与视频观看和视频评级有关的其他两个半相关的表格.现在请注意,由于隐私问题,我无意将更多列专门添加到视频视图表中(是的,我知道我将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
Run Code Online (Sandbox Code Playgroud)
此查询应返回与给定视频 (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;
Run Code Online (Sandbox Code Playgroud)