Подтвердить что ты не робот

COUNT/GROUP BY с активной записью?

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

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?

4b9b3361

Ответ 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    |

В прошлом мне всегда было трудно точно знать, что делает CodeIgniter с моими активными цепочками записей. Особенно, когда цепи становятся несколько сложными. Ваше сообщение вдохновило меня создать простой инструмент для отображения фактического оператора SQL.

Чтобы использовать инструмент, просто вставьте активную запись и нажмите кнопку "Отправить". Он должен возвращать соответствующий оператор SQL. Примечание. Я быстро взбивал и не тестировал его полностью. Он не подключается к db, поэтому некоторые типы запросов могут приводить к ошибкам.

Инструмент предварительного просмотра активной записи здесь.

ОБНОВЛЕНИЕ: Как указывалось в комментариях, исходный запрос суммировал user_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() и SQL_CALC_FOUND_ROWS. Вам понадобятся два запроса: select, group_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" - две даты в базе данных, а "резервирование" - это имя таблицы.

Вид:

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