【问题标题】:MySQL query for similar videos via video tagging (CodeIgniter)MySQL 通过视频标记(CodeIgniter)查询类似视频
【发布时间】:2013-02-24 19:28:51
【问题描述】:

我正在开发一个包含视频部分的 PHP 应用程序。到目前为止,我已经将视频标记构建为视频分类。添加视频时,您可以从 25 个预定义标签中选择最能描述您的视频内容的标签。

这些标签随后保存在一个单独的表中,videotags,如下所示:

video_id | first_tag | second_tag | third_tag | etc.
----------------------------------------------------
     123 |         1 |          0 |          1| ...

也就是说,当您在表单中签入某个标签时,它在数据库中存储为 1,未选中为 0。

现在,当您观看视频时,您可以看到一个主体,即视频和说明所在的位置,以及一个右列,应在其中类似视频的位置。

我想构建一个 MySQL 查询,该查询将返回 6 个类似视频,基于具有如下规则的视频标签:

那些视频标签与观看的视频最相同的视频将被订购并限制为 6 个。

例如,我正在尝试查看一个 ID 为 12、有六个填充标签的视频,并且在我的数据库中我有 3 个视频:

  • 具有 7 个标签和 4 个标签的 ID 为 22 的视频与 ID 为 12 的视频相同。
  • ID 为 25 且有 8 个标签和 5 个标签的视频与 ID 12 的视频相同。
  • ID 为 45 且有 4 个标签和 3 个标签的视频与 ID 12 的视频相同。

正如我在主题名称中提到的,我正在 CodeIgniter 中构建这个 PHP 应用程序,所以这个查询将作为一个函数在特定模型中运行,我将在这个函数中传递数组 $tags 就像这样 @987654324 @。

谁能帮我按照指定的方式构建这个查询?我正在使用 CI 中的 Active Record 类,因此使用它会很受欢迎。

谢谢大家的回复

【问题讨论】:

    标签: php mysql codeigniter video tags


    【解决方案1】:

    查询应该如下所示:

    SELECT video_id 
    FROM videotags 
    ORDER BY ABS(
      first_tag - 1 +
      second_tag - 0
    ) ASC
    LIMIT 3
    

    在 ActiveRecord 中,函数看起来像这样:

    function getTop($n, $tags) {
      $this->db->select('video_id');
      $order = array();
      foreach ($tags as $field => $value) {
        if ($value) {
          $order[] = $field .' - '. $value;
        }
      }
      $this->db->order_by('ABS('.implode(' + ', $order).')', 'ASC');
      return $this->db->get('videotags', $n);
    }
    

    请注意,我尚未对其进行测试。此外,对于许多行,查询会相当慢。

    【讨论】:

    • 谢谢,效果很好!我只需要在那里发送非零标签,并将“DESC”更改为“ASC”。 AquillaX,我向你致以最深切的谢意。
    猜你喜欢
    • 2015-07-14
    • 2017-05-14
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多