2011-03-04 65 views
5

我有一個檢索表中的所有標籤的功能:笨 - 活動紀錄 - SQL - 複雜的聯接

function global_popular_tags() { 
    $this->db->select('tags.*, COUNT(tags.id) AS count'); 
    $this->db->from('tags'); 
    $this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id'); 
    $this->db->group_by('tags.id'); 
    $this->db->order_by('count', 'desc'); 
    $query = $this->db->get()->result_array(); 
    return $query; 
} 

我所說的另一個表「工作」。 「工作」表具有值爲1或0的「草稿」列。我希望COUNT(tags.id)考慮具體標記的工作是否處於草稿模式(1)。

假設有10件作品,例如'design'標記。 COUNT將爲10.但其中有2項工作處於草稿模式,因此COUNT應該是8.我如何管理這些?

+1

如果有疑問,可以隨時切換到vanilla SQL。 – janosrusiczki 2011-03-04 15:23:17

+1

作爲一種預防措施,您需要避免在查詢中使用'*'選擇器,這不是一種好的做法,總是定義您想返回的列名,*從不*執行'SELECT * FROM ...' – Jakub 2011-03-07 05:52:54

回答

7

嘗試改變:

$this->db->from('tags'); 
$this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id'); 

要:

$this->db->from('tags, work'); 
$this->db->join('tags_to_work', 'tags.id=tags_to_work.tag_id AND work.id=tags_to_work.work_id'); 

並添加:

$this->db->where('work.drafts', 0); 
+0

謝謝,但它不是具有'tag_id'列的工作表,它是tags_to_work表。我試過:$ this-> db-> join('tags_to_work AS ttw','work.id = ttw.work_id AND work.draft = 0');但是我得到的是33而不是1,66而不是2! – Jack 2011-03-04 15:50:18

+0

@傑克:這會工作嗎? (見編輯後) – 2011-03-04 15:56:29

+0

魔術,這工作! – Jack 2011-03-04 17:25:52

2

您可以使用,而不是使用活動記錄類純SQL,我自己正在努力與CI超過2年,大部分時間我避免活躍的記錄類,導致直接sql更容易調試和編寫複雜的查詢。 這是我將如何使用它。

 
$sql = "SELECT...your sql here"; 
$q = $this->db->query($sql); 
... 
//Do something with your query here