group_by по результату запроса к базе данных Не работает - PullRequest
0 голосов
/ 18 июня 2020

Итак, у меня есть следующая простая таблица базы данных, чтобы упростить задачу

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();
        }

Итак, проблема в том, что всякий раз, когда я пытаюсь сгруппировать строки по их состоянию, я получаю следующую ошибку! но как только я удаляю группу строкой кода, все работает отлично, и я без проблем регистрирую все строки в консоли! проблема в том, что я хочу, чтобы они были сгруппированы по штатам!

Пожалуйста, помогите мне!

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

A group by не имеет особого смысла при выполнении select *. Не в конструкторе запросов Codeigniter, а не в SQL

Причина в том, что группировка предназначена для создания сгруппированной сводки всех данных (строки объединяются), но вы не указываете c, что вы хотите сделать с сгруппированными строками.

Например, возьмите образец данных. Если группировать по штатам, что произойдет со столбцами client_id и client_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

вы хотите добавить идентификаторы клиентов всех клиентов в каждом состоянии? Попробуйте

$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

Помните, при группировке вам нужно указать c как в отношении того, что вы хотите группировать, так и того, какой желаемый результат есть.

0 голосов
/ 18 июня 2020

MySQL не может сделать это изначально. Вам нужно будет получить то, что вам нужно, а затем перебрать l oop, используя язык программирования (в данном случае, вероятно, PHP). Вот упрощенная c версия того, как будет выглядеть этот алгоритм.

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;
}
...