【问题标题】:group_by on database query result Not working数据库查询结果上的 group_by 不起作用
【发布时间】:2020-10-08 12:05:45
【问题描述】:

所以我有以下简单的数据库表来让事情变得更简单

Client_id | Client_name     | Client_state 

1         | John            | New York           
2         | Nick            | New York                     
3         | Marc            | California                  
4         | Jason           | California         
5         | Gabriel         | Seattle                    
6         | Alex            | Seattle   

所以每当我点击以下按钮时

<button type="button" class="btn results btn-primary">results</button>

我有一个 Javascript 函数,它调用 ajax 来获取结果。这是我的功能

$('.results').on('click',function(){
        $.ajax({
                    type: 'ajax',
                    method: 'get',
                    async: false,
                    url: '<?php echo base_url() ?>client_results',
                    dataType: 'json',
                    success: function(response){
                        console.log(response)
                    }, //end success function
                    error: function(){
                        alert('Error');
                    }

                });//end ajax call

这是我的模态函数

      public function client_results(){
            $this->db->select('*');
            $this->db->group_by("Client_state"); // whenever i remove this i get all the rows without a problem 
            $query = $this->db->get('Clients');
            return $query->result_array();
        }

所以问题是每当我尝试按状态对行进行分组时,我都会收到以下错误! 但是,一旦我通过一行代码删除了 groupe,一切都可以正常工作,并且我将所有行都记录在控制台中而没有问题!问题是我希望它们按状态分组!

请帮帮我!

【问题讨论】:

  • 您希望从该查询中得到什么? SELECT * 在进行分组时真的没有意义。
  • 你可能想要ORDER BY,而不是GROUP BY。 Order By 按特定顺序对所有行进行排序。 Group by 根据指定的列组合行,这对于计算行数或将另一列中的总数相加非常有用。
  • WHERE,如果您只想获取具有特定Client_state 的客户
  • @TheGentleman 我不想选择特定的状态,我不需要在哪里!我想要分组的行,就是这样!
  • Group By 用于创建聚合。像 SELECT Client_state, COUNT(id) as total from Clients,它将返回类似 California 2|New York 2SELECT order_id, count(id) as num_items, SUM(item_total) as subtotal from order_items GROUP BY order_id 以获取列数和/或列总数。

标签: javascript php ajax codeigniter activerecord


【解决方案1】:

MySQL 本身无法做到这一点。您必须获得所需的内容,然后使用编程语言(在本例中可能是 PHP)遍历循环。这是该算法的简化版本。

public function client_results(){
    $this->db->select('*');
    $query = $this->db->get('Clients');
    $results = $query->result_array();
    $groupedResults = array();

    foreach($results as $row) {
        if (!array_key_exists($row->Client_state, $groupedResults)) {
            $groupedResults[$row->Client_state] = array();
        }
        $groupedResults[$row->Client_state][] = $row->Client_name;
    }

    return $groupedResults;
}

【讨论】:

    【解决方案2】:

    group by 在执行 select * 时没有多大意义。不在 Codeigniter 的查询生成器上,不在 SQL 上

    原因是分组旨在生成所有数据的分组摘要(行合并),但您并没有具体说明要对分组行做什么。

    例如,获取您的样本数据。如果按州分组,client_idclient_name 列会发生什么情况? SQL 并不真正知道如何处理它们,因为您的查询不明确。

    您想获得每个州的客户数量吗? 试试

    $this->db->select('Client_state,count(*) as n');
    $this->db->from('Clients');
    $this->db->group_by('Client_state');
    

    上面会输出:

    Client_state | n
    
    New York     | 2
    California   | 2
    Seattle      | 2
    

    您想添加每个州的所有客户端的客户端 ID 吗? 试试

    $this->db->select('Client_state,sum(Client_id) as sum');
    $this->db->from('Clients');
    $this->db->group_by('Client_state');
    

    上面会输出:

    Client_state | sum
    
    New York     | 3
    California   | 7
    Seattle      | 11
    

    请记住,在分组时,您需要具体说明您想要分组的内容以及您想要的结果。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2018-04-15
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多