在Laravel和MySQL中查找JSON字段的相似性

6tdlim6h  于 11个月前  发布在  Mysql
关注(0)|答案(1)|浏览(74)

我有一个名为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]}
];

li9yvcax

li9yvcax1#

假设你在控制器中检索到了视频,你现在有了标签数组[1,2,3,4]。你现在需要为类似的视频构建查询,一个工作解决方案是:

$users = DB::table('videos')
            ->whereJsonContains('json-column-name', [1])
            ->orWhereJsonContains('json-column-name', [2])
            ->orWhereJsonContains('json-column-name', [3])
            ->orWhereJsonContains('json-column-name', [4])
            ->get();

字符串
现在,您可以根据标记数组的长度动态构建上面的查询。
我还想根据与我们感兴趣的视频相同的标签数量来排序类似的视频。在这种情况下,我们的结果应该排序为[video2,video3,video4],因为video2有3个与video1相似的标签,video4只有1个。
我没有考虑过最后一部分,但我可能会通过Laravel的集合方法来解决它,而不是直接使用MySQL查询。

相关问题