2010-09-28 172 views
2

我想寫下如下的MySQL SELECT語句來減少獲取信息所需的查詢次數,但我不確定如何編寫它。我該如何編寫這個查詢?

我有兩個表 - tags和books_tags(一個多對多的關係連接表)。最終輸出我想將打印如下:

<label for="formFiltertag1"><input type="checkbox" name="tag[]" value="1" id="formFiltertag1" class="rank90" /> PHP (15)<br /></label> 

若文本標籤(tags.name),並在括號中數字的名字是多久標籤的ID出現在結表計數(COUNT(books_tags.tag_id))。輸入ID和值將基於tags.id字段動態變化。

我原本以爲我只是運行一個查詢,獲取標籤表中的所有信息,然後使用foreach循環爲每個查詢運行一個單獨的計數查詢,但隨着它們數量的增長,很快變得笨拙。

下面是一個例子,因爲我有它現在寫入(使用CodeIgniter的ActiveRecord的圖案)...

模型:

function get_form_tags() { 
    $query = $this->db->get('tags'); 
    $result = $query->result_array(); 
    $tags = array(); 
    foreach ($result as $row) { 
     $this->db->select('tag_id')->from('books_tags')->where('tag_id', $row['id']); 
     $subResult = $this->db->count_all_results(); 
     $tags[] = array('id' => $row['id'], 'tag' => $row['tag'], 'count' => $subResult); 
    } 
    return $tags; 
} 

控制器:

function index() { 
    $this->load->model('browse_model', 'browse'); 
    $tags = $this->browse->get_form_tags(); 

    $data['content'] = 'browse/browse'; 
    $data['tags'] = $tags; 
    $this->load->view('global/template', $data); 
} 

視圖(冷凝):

<?php foreach ($tags as $tag) : ?> 
<label for="formFiltertag<?php echo $tag['id'] ?>"><input type="checkbox" name="tag[]" value="<?php echo $tag['id'] ?>" id="formFiltertag<?php echo $tag['id'] ?>" class="rank<?php echo $tag['count'] ?>" /> <?php echo $tag['tag'] . ' (' . $tag['count'] . ')' ?><br /></label> 
<?php endforeach; ?> 

這是有效的,但正如我所說的,它會創造更多的查詢,而不是完成任務所需的查詢。當然有更好的方法。一分錢爲你的想法?

由於多, 馬庫斯

回答

2
select t, coalesce(btc.Count, 0) as Count 
from tags t 
left outer join (
    select tagid, count(*) as Count 
    from books_tags 
    group by tagid 
) btc on t.tagid = btc.tagid 
+0

這適用於一些小修改。謝謝您的幫助。有沒有人碰巧知道如何使用ActiveRecord方法編寫這種複雜的語句? – Marcus 2010-09-28 21:58:01

1

$result返回數組的數組,其中array_combine()期望字符串的數組。

+0

好信息 - 謝謝。我現在重寫了上面的代碼示例。 – Marcus 2010-09-28 21:32:41