Cela marche:
$sql = "SELECT id
FROM `users`
WHERE `account_status` = '" . $i . "'";
$query = $this->db->query($sql);
var_dump($query->num_rows());
Mais cela ne veut pas:
$sql = "SELECT COUNT(*)
FROM `users`
WHERE `account_status` = '" . $i . "'";
$query = $this->db->query($sql);
var_dump($query->num_rows());
Comment faire un num_rows sur une requête COUNT (*)? Est-ce que ça fait aussi la 2ème manière de meilleures performances?
Faire une COUNT(*)
vous donnera seulement une ligne singulière contenant le nombre de lignes et non le résultat lui-même.
Pour accéder à COUNT(*)
, vous devez faire
$result = $query->row_array();
$count = $result['COUNT(*)'];
La deuxième option fonctionne beaucoup mieux car il n’est pas nécessaire de renvoyer un jeu de données à PHP mais plutôt à un décompte et est donc beaucoup plus optimisé.
En CI, c’est très simple, tout ce dont vous avez besoin est
$this->db->where('account_status', $i);
$num_rows = $this->db->count_all_results('users');
var_dump($num_rows); // prints the number of rows in table users with account status $i
$query->num_rows()
Le nombre de lignes renvoyées par la requête. Remarque: Dans cet exemple, $ query est la variable à laquelle l'objet de résultat de la requête est affecté:
$query = $this->db->query('SELECT * FROM my_table');
echo $query->num_rows();
num_rows sur votre requête COUNT () sera littéralement TOUJOURS égal à 1. Il s'agit d'une fonction d'agrégation sans clause GROUP BY. Toutes les lignes sont donc regroupées dans une seule. Si vous voulez le valeur du compte, vous devez lui donner un identifiant SELECT COUNT(*) as myCount ...
, puis utilisez votre méthode habituelle d'accès à un résultat (le premier, seul résultat) et obtenez sa propriété 'myCount'.
Je suggérerais au lieu de faire une autre requête avec les mêmes paramètres en exécutant immédiatement une fonction SELECT FOUND_ROWS()
$list_data = $this->Estimate_items_model->get_details(array("estimate_id" => $id))->result();
$result = array();
$counter = 0;
$templateProcessor->cloneRow('Title', count($list_data));
foreach($list_data as $row) {
$counter++;
$templateProcessor->setValue('Title#'.$counter, $row->title);
$templateProcessor->setValue('Description#'.$counter, $row->description);
$type = $row->unit_type ? $row->unit_type : "";
$templateProcessor->setValue('Quantity#'.$counter, to_decimal_format($row->quantity) . " " . $type);
$templateProcessor->setValue('Rate#'.$counter, to_currency($row->rate, $row->currency_symbol));
$templateProcessor->setValue('Total#'.$counter, to_currency($row->total, $row->currency_symbol));
}
$query = $this->db->get();
if ($query->num_rows() > 0) {
echo 'have row';
} else {
echo 'no row return from db';
}
Cela ne renverra qu'une ligne, car vous sélectionnez simplement une COUNT()
. vous utiliserez mysql_num_rows()
sur le $query
dans ce cas.
Si vous voulez obtenir un nombre de chacune des ID
's, ajoutez GROUP BY id
à la fin de la chaîne.
En ce qui concerne les performances, n’utilisez jamais *
dans vos requêtes. S'il y a 100 champs uniques dans une table et que vous voulez tous les obtenir, vous écrivez tous les 100, pas *
. En effet, *
doit recalculer le nombre de champs à parcourir, chaque fois qu’il saisit un champ, ce qui prend beaucoup plus de temps à appeler.