0

ビデオセクションを含むPHPアプリケーションに取り組んでいます。これまで、動画の分類として動画のタグ付けを構築してきました。ビデオを追加するとき、ビデオ コンテンツを最もよく表す 25 の定義済みタグから選択できます。

これらのタグは、videotags次のような別のテーブル に保存されます。

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

つまり、フォームにいくつかのタグをチェックインすると、データベースに 1 として保存され、0 としてチェックされません。

動画を表示すると、動画と説明が表示される本文と、類似の動画が表示される右側の列が表示されます。

次のようなルールを持つビデオ タグに基づいて、6 つの類似したビデオを返す MySQL クエリを作成したいと思います。

視聴した動画と最も同じ動画タグを持つ動画が注文され、6 つに制限されます。

たとえば、ID 12 のビデオを表示しようとしています。このビデオには 6 つの塗りつぶされたタグがあり、データベースには 3 つのビデオがあります。

  • 7 つのタグを持つ ID 22 のビデオと 4 は、ID 12 のビデオと同じです。
  • 8 個のタグと 5 個の ID を持つ ID 25 のビデオは、ID 12 のビデオと同じです。
  • 4 つのタグと 3 つの ID 45 のビデオは、ID 12 のビデオと同じです。

トピック名で述べたように、私はこの PHP アプリケーションを CodeIgniter で構築しているので、このクエリは特定のモデルで関数として実行されます。この関数には、この$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 に答える