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:
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?
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.
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());
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é.
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;
$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();