2012-01-24 28 views
20

Tengo una tabla con la siguiente información:COUNT/GROUP BY con registro activo?

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

etc. 

Lo que quiero es un top 10 (matriz) con la mayoría de entradas por user_id (orden de mayor a menor). Así, utilizando la tabla anterior que necesito la siguiente matriz a cambio:

  • 12 => 3 filas
  • 15 => 2 filas
  • 18 => 1 fila
  • etc.

¿Cómo puedo hacer esto con CodeIgniter usando el método de consulta de registro activo? ¿Se puede hacer esto con COUNT y GROUP BY user_id?

Respuesta

54

creo que querrá algo como esto:

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

Esto producirá un resultado como

| USER_ID | TOTAL | 
| 12 | 3 | 
| 15 | 2 | 
| 18 | 1 | 

En el pasado siempre he encontrado que es difícil saber exactamente qué es CodeIgniter haciendo con mis cadenas de discos activas. Especialmente cuando las cadenas se vuelven algo complejas. Tu publicación me inspiró a crear una herramienta simple para mostrar la declaración SQL real.

Para usar la herramienta simplemente pegue su registro activo y haga clic en el botón Enviar. Es debe devolver la instrucción SQL correspondiente. Nota: Hice esto rápidamente y no lo he probado a fondo. No está conectado a un DB, por lo que algunos tipos de consultas pueden dar lugar a errores.

Active Record preview tool here.

ACTUALIZACIÓN: Como algunos señalaron en los comentarios, la consulta original sumaba los user_ids en lugar de contarlos. Actualicé la consulta de registro activo para corregir esto.

+0

También es posible usar la función '$ this-> db-> last_query()' para ver qué registro activo genera a partir de las funciones [Guía del usuario: Ayudante de consultas Funciones] (http://codeigniter.com/user_guide/database/helpers.html) –

+0

Eso también funciona, aunque a menudo necesita cambiar una serie de configuraciones de CI para que no arroje un error cuando intenta ejecutar un inválido consulta. –

+3

Esta respuesta suma los user_ids en lugar de contarlos. –

2

Creo que deberías contar los resultados con FOUND_ROWS() and SQL_CALC_FOUND_ROWS. Necesitará dos consultas: select, group_by, etc. Agregará un más seleccione: SQL_CALC_FOUND_ROWS user_id. Después de esta consulta, ejecute una consulta: SELECT FOUND_ROWS(). Esto devolverá el número deseado.

8

pesar de que es una respuesta tardía, yo diría que esto le ayudará a ...

$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()); 
1

Este código cuenta filas con rango de fechas:

controlador:

$this->load->model("YourModelName"); 
$data ['query'] = $this->YourModelName->get_report(); 

Modelo :

public function get_report() 
    { 
     $query = $this->db->query("SELECT * 
FROM reservation WHERE arvdate <= '2016-7-20' AND dptrdate >= '2016-10-25' "); 
     return $query; 
    } 

donde 'arvdate' y 'dptrdate' son dos fechas en la base de datos y 'reservation' es el nombre de la tabla.

Vista:

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

Este código es para devolver el número de filas. Para volver datos de la tabla, a continuación, utilizar

$query->rows(); 
return $row->table_column_name; 
0
$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(); 
Cuestiones relacionadas