web-dev-qa-db-fra.com

COUNT / GROUP BY avec enregistrement actif?

J'ai une table avec les informations suivantes:

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

etc.

Ce que je veux, c'est un top 10 (tableau) avec la plupart des entrées par user_id (ordre élevé à faible). Donc, en utilisant le tableau ci-dessus, j'ai besoin du tableau suivant en retour:

  • 12 => 3 rangées
  • 15 => 2 rangées
  • 18 => 1 ligne
  • etc.

Comment puis-je faire cela avec CodeIgniter en utilisant la méthode de requête d'enregistrement actif? Cela peut-il être fait avec COUNT et GROUP BY id_utilisateur?

24
24creative

Je pense que vous voudrez quelque chose comme ça:

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

Cela produira un résultat comme

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

PDATE: Comme certains l'ont souligné dans les commentaires, la requête d'origine additionnait les user_ids plutôt que de les compter. J'ai mis à jour la requête d'enregistrement active pour corriger cela.

77
Brett DeWoody

Bien que ce soit une réponse tardive, je dirais que cela vous aidera ...

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

Je pense que vous devriez compter les résultats avec FOUND_ROWS () et SQL_CALC_FOUND_ROWS . Vous aurez besoin de deux requêtes: select, group_by, Etc. Vous ajouterez une sélection plus: SQL_CALC_FOUND_ROWS user_id. Après cette requête, exécutez une requête: SELECT FOUND_ROWS(). Cela renverra le numéro souhaité.

2
uzsolt

Ce code compte des lignes avec une plage de dates:

Manette:

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

Modèle:

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

où 'arvdate' et 'dptrdate' sont deux dates dans la base de données et 'reservation' est le nom de la table.

Vue:

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

Ce code doit renvoyer le nombre de lignes. Pour renvoyer des données de table, utilisez ensuite

$query->rows();
return $row->table_column_name;
1
Infolet.org
$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();
0
user3444748