0

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

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

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

这意味着,当您在表单中签入某个标签时,它在数据库中存储为 1,未选中为 0。

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

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

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

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

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

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

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

谢谢各位回复

4

1 回答 1

0

查询应该看起来像这样:

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);
}

请注意,我没有测试过它。此外,对于许多行,查询会相当慢。

于 2013-02-25T05:30:11.147 回答