COUNT / GROUP BY с активной записью? - PullRequest
24 голосов
/ 24 января 2012

У меня есть таблица со следующей информацией:

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

etc.

То, что я хочу, - это топ-10 (массив) с большинством записей на user_id (от высокого к низкому порядку).Поэтому, используя приведенную выше таблицу, мне понадобится следующий массив:

  • 12 => 3 строки
  • 15 => 2 строки
  • 18 => 1 строка
  • и т. Д.

Как я могу сделать это с CodeIgniter, используя метод запроса активной записи?Можно ли это сделать с помощью COUNT и GROUP BY user_id?

Ответы [ 5 ]

76 голосов
/ 25 января 2012

Полагаю, вы захотите что-то вроде этого:

 $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    |

ОБНОВЛЕНИЕ: Как отмечалось в комментариях, исходный запрос суммировал значения user_ids, а не подсчитывал их. Я обновил запрос активной записи, чтобы исправить это.

9 голосов
/ 13 ноября 2013

Хотя это поздний ответ, я бы сказал, что это поможет вам ...

$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());
2 голосов
/ 24 января 2012

Я думаю, что вы должны посчитать результаты с FOUND_ROWS () и SQL_CALC_FOUND_ROWS . Вам понадобятся два запроса: select, group_by и т. Д. Вы добавите плюс и выберите: SQL_CALC_FOUND_ROWS user_id. После этого запроса выполните запрос: SELECT FOUND_ROWS(). Это вернет желаемый номер.

1 голос
/ 06 октября 2016

Этот код считает строки с диапазоном дат:

Контроллер:

$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' - две датыв базе данных, а 'booking' - это имя таблицы.

Просмотр:

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

Этот код возвращает число строк.Чтобы вернуть данные таблицы, используйте

$query->rows();
return $row->table_column_name;
0 голосов
/ 27 сентября 2017
$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();
...