我有一个名为videos的表。当我加载一个视频时,我需要使用一个名为tags的列来查找与之相似的视频。该列是一个JSON字段,其中包含来自另一个名为tags
的表的tag_id
s,我认为在这种情况下不会感兴趣。
当我加载video1
,其中有标签,如[1,2,3,4]
,我应该能够找到类似的视频,它有标签,如video2 [2,3,4,5]
,video3 [3,4,5,6]
和video4 [4,5,6,7]
,但它不应该找到video5
,其中有标签[5,6,7,8]
。
我还想根据与我们感兴趣的视频相同的标签数量来排序类似的视频。在这种情况下,我们的结果应该排序为[video2,video3,video4],因为video2有3个与video1相似的标签,video4只有1个。
我有一个粗略的线索,该解决方案可以使用JSON_CONTAINS
,但我不知道如何实现它。Laravel方法是首选,而不是原始SQL,但这只是首选。
我的逻辑是这样的:
$video = {id: 1, tags: [1,2,3,4]};
$similarVideos = Video::where(
/* select other videos that have tags 1 or 2 or 3 or 4 */
);
字符串
预期成果:
$similarVideos = [
{id:2, tags: [2,3,4,5]},
{id:3, tags: [3,4,5,6]},
{id:4, tags: [4,5,6,7]}
];
型
1条答案
按热度按时间li9yvcax1#
假设你在控制器中检索到了视频,你现在有了标签数组[1,2,3,4]。你现在需要为类似的视频构建查询,一个工作解决方案是:
字符串
现在,您可以根据标记数组的长度动态构建上面的查询。
我还想根据与我们感兴趣的视频相同的标签数量来排序类似的视频。在这种情况下,我们的结果应该排序为[video2,video3,video4],因为video2有3个与video1相似的标签,video4只有1个。
我没有考虑过最后一部分,但我可能会通过Laravel的集合方法来解决它,而不是直接使用MySQL查询。