代码之家  ›  专栏  ›  技术社区  ›  Marcus

如何编写此查询?

  •  2
  • Marcus  · 技术社区  · 15 年前

    我想写下面的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; ?>
    

    这是可行的,但就像我说过的,它将创建比完成任务所需的查询更多的查询。当然有更好的方法。为你的想法分文?

    非常感谢, 马库斯

    2 回复  |  直到 15 年前
        1
  •  2
  •   D'Arcy Rittich    15 年前
    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
    
        2
  •  1
  •   GSto    15 年前

    $result 返回数组数组,其中 array_combine() 需要字符串数组。

    推荐文章