COUNT / GROUP BY 与活动记录?

Posted

技术标签:

【中文标题】COUNT / GROUP BY 与活动记录?【英文标题】:COUNT / GROUP BY with active record? 【发布时间】: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 来完成吗?

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于COUNT / GROUP BY 与活动记录?的主要内容,如果未能解决你的问题,请参考以下文章

mysqli COUNT与WHERE和GROUP BY

GROUP_BY 内的活动记录 LIMIT

如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空

MySQL Query - 使用 group-by 时获取丢失的记录

group by两个分组字段的查询

数据库Group By类型语句统计记录条数