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?
Ответы
Ответ 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();