我有3个表:一个表处理视频,另一个表处理视频类别。一个视频可以具有多个类别,并且类别可以与多个视频相关联:因此,video_category_join表
像这样:
表格:视频
--------------------
video_id
标题
说明
持续时间
...
表格:视频类别
--------------------
video_category_id
名称
表:video_category_join
--------------------
video_id
video_category_id
给出一个video_id,我想选择20个与video_id类别相同的视频。
我能够进行查询,就像这样:
SELECT DISTINCT v.video_id, v.title, v.duration
FROM video_category_join vc
JOIN video_category_join vc2 ON vc2.video_category_id = vc.video_category_id AND vc2.video_id <> vc.video_id
JOIN video v ON v.video_id = vc2.video_id
WHERE vc.video_id = 5
ORDER BY RAND()
LIMIT 20
到目前为止很好。
我的问题如下:有时结果集返回的视频少于20个,所以我希望能够通过随机选择视频来补偿,直到我获得20个视频为止(优先级始终是选择相同类别的视频,并且如有必要,随机播放视频,直到我获得20个视频为止)
我该如何实现?
答案 0 :(得分:1)
编写另一个查询,该查询返回20个不在同一类别中的随机视频。将两个查询放到UNION
中,然后从中返回20个视频。
要使其偏向具有相同类别的对象,请在子查询中添加一个preferred
列,然后按此顺序进行排序。
SELECT video_id, title, duration
FROM (
SELECT DISTINCT v.video_id, v.title, v.duration, 1 as preferred
FROM video_category_join vc
JOIN video_category_join vc2 ON vc2.video_category_id = vc.video_category_id AND vc2.video_id <> vc.video_id
JOIN video v ON v.video_id = vc2.video_id
WHERE vc.video_id = 5
ORDER BY RAND()
LIMIT 20
)
UNION (
SELECT DISTINCT v.video_id, v.title, v.duration, 2 AS preferred
FROM video_category_join vc
JOIN video_category_join vc2 ON vc2.video_category_id <> vc.video_category_id AND vc2.video_id <> vc.video_id
JOIN video v ON v.video_id = vc2.video_id
WHERE vc.video_id = 5
ORDER BY RAND()
LIMIT 20
)
ORDER BY preferred
LIMIT 20