我想写下面的mysql select语句来减少获取信息所需的查询数量,但我不知道如何写。
我有两个表-标签和书籍标签(多对多关系连接表)。我想要的最终输出将打印如下:
<label for="formFiltertag1"><input type="checkbox" name="tag[]" value="1" id="formFiltertag1" class="rank90" /> PHP (15)<br /></label>
其中,文本是标记的名称(tag s.name),parens中的数字是标记的ID在联接表中出现的频率(count(books_tags.tag_id))的计数。输入ID和值将基于tags.id字段动态显示。
我原本以为我只需要运行一个从标记表中获取所有信息的查询,然后使用for each循环为每个表分别运行一个计数查询,但是随着标记数量的增长,可能会很快变得难以处理。
这是我现在写的一个例子(使用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; ?>
这是可行的,但就像我说过的,它将创建比完成任务所需的查询更多的查询。当然有更好的方法。为你的想法分文?
非常感谢,
马库斯