【问题标题】:COUNT / GROUP BY with active record?COUNT / GROUP BY 与活动记录?
【发布时间】:2012-02-17 18:49:35
【问题描述】:

我有一张包含以下信息的表格:

id  |  user_id  |  points
--------------------------
1   |  12       |  48
2   |  15       |  36
3   |  18       |  22
4   |  12       |  28
5   |  15       |  59
6   |  12       |  31

etc.

我想要的是每个 user_id 条目最多的前 10 个(数组)(从高到低排序)。 因此,使用上面的表格,我需要以下数组作为回报:

  • 12 => 3 行
  • 15 => 2 行
  • 18 => 1 行

如何使用 CodeIgniter 使用活动记录查询方法做到这一点?这可以用 COUNT 和 GROUP BY user_id 来完成吗?

【问题讨论】:

    标签: codeigniter activerecord count group-by


    【解决方案1】:

    我相信你会想要这样的东西:

     $this->db->select('user_id, COUNT(user_id) as total');
     $this->db->group_by('user_id'); 
     $this->db->order_by('total', 'desc'); 
     $this->db->get('tablename', 10);
    

    这将产生类似

    的结果
    |  USER_ID |  TOTAL  |
    |    12    |    3    |
    |    15    |    2    |
    |    18    |    1    |
    

    更新:正如一些在 cmets 中指出的那样,原始查询是对 user_ids 求和而不是对它们进行计数。我已更新活动记录查询以更正此问题。

    【讨论】:

    • 您也可以使用$this->db->last_query()函数查看User Guide: Query Helper Functions函数生成的活动记录
    • 这也行得通,尽管您经常需要更改一堆 CI 设置,以便它在尝试运行无效查询时不会引发错误。
    • 这个答案是对 user_ids 求和而不是对它们进行计数。
    • 对键求和而不是计数。对于用户 id 12,这将输出:36 这当然是不受欢迎的!
    • 我想指出的是,它计算的是 id 而不是行数。这就是为什么要投反对票。
    【解决方案2】:

    虽然这是一个迟到的答案,但我想说这会对你有所帮助......

    $query = $this->db
                  ->select('user_id, count(user_id) AS num_of_time')
                  ->group_by('user_id')
                  ->order_by('num_of_time', 'desc')
                  ->get('tablename', 10);
    print_r($query->result());
    

    【讨论】:

      【解决方案3】:

      我认为你应该用FOUND_ROWS() and SQL_CALC_FOUND_ROWS 来计算结果。您将需要两个查询:selectgroup_by 等。您将添加一个加号选择:SQL_CALC_FOUND_ROWS user_id。在此查询之后运行查询:SELECT FOUND_ROWS()。这将返回所需的数字。

      【讨论】:

        【解决方案4】:

        此代码计算日期范围内的行数:

        控制器:

        $this->load->model("YourModelName");
        $data ['query'] = $this->YourModelName->get_report();
        

        型号:

          public function get_report()
             {   
               $query = $this->db->query("SELECT  *
        FROM   reservation WHERE arvdate <= '2016-7-20' AND  dptrdate >= '2016-10-25' ");
               return $query;
             }
        

        其中 'arvdate' 和 'dptrdate' 是数据库中的两个日期,而 'reservation' 是表名。

        查看:

        <?php
         echo $query->num_rows();
        ?>
        

        此代码用于返回行数。 要返回表数据,请使用

        $query->rows();
        return $row->table_column_name;
        

        【讨论】:

          【解决方案5】:
          $this->db->select('overal_points');
          $this->db->where('point_publish', 1);
          $this->db->order_by('overal_points', 'desc'); 
          $query = $this->db->get('company', 4)->result();
          

          【讨论】:

            猜你喜欢
            • 2016-01-27
            • 2010-12-11
            • 2016-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多