MySQL:返回相同类别的数据,然后根据需要添加更多随机数据

时间:2019-07-15 21:45:46

标签: mysql

我有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个视频为止)

我该如何实现?

1 个答案:

答案 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