2013-02-24 22 views
0

我正在開發一個PHP應用程序,包括視頻部分。到目前爲止,我已將視頻標記構建爲視頻分類。當您添加視頻時,您可以從25個預定義標籤中進行選擇,以便最好地描述您的視頻內容。然後MySQL通過視頻標記查詢類似視頻(CodeIgniter)

這些標籤都保存在一個單獨的表,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個與視頻w相同ith ID 12.
  • ID爲25的視頻具有8個標籤,5個與ID 12視頻相同。
  • ID爲45的視頻具有4個標籤,3個與ID 12視頻相同。

正如我在主題名稱都提到,我建立CI中的PHP應用程序,因此該查詢將在一個特定的模式作爲一個函數來運行,我會在這個函數來傳遞數組$tags這樣$tags['first_tag'] = 1

任何人都可以幫助我建立這個查詢指定?我正在使用CI中的Active Record Class,因此使用它會受到歡迎。

謝謝你們爲響應

回答

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

請注意,我的天堂」對它進行測試。此外,對許多行來說,查詢將會相當緩慢。

+0

謝謝,它的工作很棒!我只需要在那裏發送非零標籤,並將「DESC」更改爲「ASC」。你最感謝我,AquillaX。 – marwellt 2013-02-25 10:16:50

+0

當然是ASC,我在想什麼。樂意效勞。 – AquilaX 2013-02-26 04:21:15