2013-10-03 69 views
0

我在MySQL 3個表排除與某些標籤相關的分貝條目:如何使用CI活動記錄

卡:

id | name 
1 | alpha 
2 | beta 

標籤:

id | name 
1 | a 
2 | b 

tag_link:

id | card | id 
1 | 1  | 1 
2 | 2  | 1 
3 | 2  | 2 

我想找回所有的車不包含某個標籤的ds。 CI型號:

function search($_tag) { 
    $this->db->select('card.id'); 
    $this->db->join('tag_link', 'card.id = tag_link.card'); 

    $this->db->where_not_in('tag_link.tag', $_tag); 

    $this->db->group_by('card.id'); 
    $query = $this->db->get('card'); 
    return $query; 
} 

對於標記'2',按預期返回卡'1'。但是,由於tag_link連接卡'2'和標籤'1'中的一個條目,卡'2'也被錯誤地返回。

我想過使用上面的函數獲取第一個匹配數組,然後在php中減去另一個包含所有卡片的數組,包括我不感興趣的標籤 但是,這個解決方案感覺非常笨拙。這個問題最有效的方法是什麼?

感謝, 呃逆

+0

取出加入將讓你的結果我想小提琴,嘗試在active_record –

回答

0

使用TheWolf的答案並將其轉換爲active_record。記住子查詢不被CI支持(雖然庫可以使用)

$this->db->select('id'); 
    $this->db->where('id NOT IN (SELECT card FROM tag_link WHERE tag IN $tags)', NULL, FALSE); 
    $query = $this->db->get('cards'); 
+1

近乎完美,只:'$ this-> db-> where('id NOT IN(SELECT card FROM tag_link WHERE tag IN'。$ tags。')',NULL,FALSE); ' – singultus

1

我不知道太多關於CI,但作爲一個SQL查詢,這可能工作(僞代碼混合SQL和PHP):

SELECT id 
FROM cards 
WHERE id NOT IN 
(
    SELECT card FROM tag_link WHERE tag IN $tags 
) 

子查詢返回所有包含特定標籤的卡片ID。主查詢然後返回所有其他卡ID。 (請注意,子查詢可能會在非常大的表格和/或複雜的查詢中導致性能問題)

+1

下面的解決方案,如果我有必要的聲譽,你會得到+1離我太提供的一般方法。 – singultus

+0

我已經upvoted它:) –

0

首先,你的表結構應有明確的名稱鏈接此

cards: 
------- 
id | name 
1 | alpha 
2 | beta 

tags: 
------ 
id | name 
1 | a 
2 | b 

tag_link: 
--------- 
id | card_id | tag_id 
1 | 1   | 1 
2 | 2   | 1 
3 | 2   | 2 

然後你就可以把一個和條件避免其他結果。並提供避免卡。否則回答問題是無用的。

function search($tag_id,$card_id) { 
    return $this->db 
     ->select('card.id')  
     ->from('tag_link') 
     ->join('card','card.id = tag_link.card_id','INNER') 
     ->where_not_in('tag_link.tag_id',$_tag) 
     ->where_not_in('tag_link.card_id',$card_id) 
     ->get() 
     ->result_array() 
} 

這將生成此查詢。

SELECT 
    card.id 
FROM tag_link 
    INNER JOIN card 
    ON card.id = tag_link.card_id 
WHERE tag_link.tag_id NOT IN(2) 
    AND tag_link.card_id NOT IN(2) 

正如你看到你避免卡2其他明智的你一定會得到鏈接到任何標識的所有卡反正至於少你提供TAG_ID的。
Here是測試

+0

據我所知,您的解決方案需要我事先知道排除哪些卡ID(2.您的功能參數)。由於這將包含在搜索引擎中,我不知道哪些卡可能在我想要排除的卡旁邊有另一個標籤。但是,沒有子查詢的解決方案將是有利的。 – singultus

+0

PS:這些列實際上是按照您提出的方式命名的。較短的名字是美國農業部的副產品。 – singultus