我想寫下如下的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; ?>
這是有效的,但正如我所說的,它會創造更多的查詢,而不是完成任務所需的查詢。當然有更好的方法。一分錢爲你的想法?
由於多, 馬庫斯
這適用於一些小修改。謝謝您的幫助。有沒有人碰巧知道如何使用ActiveRecord方法編寫這種複雜的語句? – Marcus 2010-09-28 21:58:01