Codeigniter Enregistrement Actif - Nombre Total Constaté Rangées avec Limite (MySQL)
Je suis en utilisant un complexe de requête SQL dans un Codeigniter modèle avec une limite appliquée. J'aimerais compter le nombre total de lignes qui aurait été constaté si le limit et offset n'avait pas été appliquée.
J'aimerais revenir le comte, avec le tableau résultat, à mon contrôleur - comment puis-je faire cela? Où dois-je mettre SQL_CALC_FOUND_ROWS si c'est la bonne solution?
Voici la requête (que je n'ai pas le construire moi-même à l'origine):
$this->db
->select('table1.*
,table2.*
,table3.*
,table4.*
,table5.*
,table6.*
,table7.*
,table8.*
,table9.*
,(SELECT GROUP_CONCAT(field1) FROM table10 WHERE table10.field3 = table9.field2) as categories
,(SELECT GROUP_CONCAT(field1) FROM table5 WHERE table5.field11 = table4.field12 AND table4.field21 = 0 AND table5.field1 != 0) as categories2
,(SELECT AVG(table11.field4) FROM table11 WHERE table11.field6 = table9.field2) as rating
,(SELECT COUNT(table12.field5) FROM table12 WHERE table12.field7 = table9.field2) as rated_times')
->from('table9')
->join('table10', 'table10.field3 = table9.field2')
->join('categories', 'categories.field1 = table10.field1')
->join('table3', 'table3.field8 = table9.field2')
->join('table1', 'table1.id = table9.field2')
->join('table2', 'table2.field9 = table9.field2 AND table2.field19 = 1', 'left')
->join('table4', 'table4.field10 = table9.field2 AND table4.field21 = 0', 'left')
->join('table5', 'table5.field11 = table4.field12 AND table5.field1 != 0', 'left')
->join('table6', 'table6.field13 = table9.field2 AND table6.field22 BETWEEN SYSDATE() - INTERVAL 90 DAY AND SYSDATE()', 'left')
->join('table7', 'table7.field14 = table9.field2', 'left')
->join('table8', 'table8.field15 = table9.field2', 'left')
->where('table1.field16', NULL)
->where($where_clause_1, null, FALSE)
->where('table9.field17', $searchArray['search_country'])
->or_where($or_where_clause_2, null, FALSE)
->or_where($or_where_clause_3, null, FALSE)
->or_where($or_where_clause_4, null, FALSE)
->or_where($or_where_clause_5, null, FALSE)
->or_where($or_where_clause_6, null, FALSE)
->or_where($or_where_clause_7, null, FALSE)
->like('table9.field17', $searchArray['search_country'])
->order_by('table3.field18', 'ASC')
->order_by('table2.field19', 'DESC')
->order_by('table1.field20', 'DESC')
->group_by('table9.field2')
->limit($limit, $offset);
$data = $this->db->get();
return $data->result_array();
Vraiment reconnaissant de toute aide!
peut-être que c' stackoverflow.com/a/23648274/2664160 //ignorer ce commentaire il a il a
OriginalL'auteur whispersan | 2013-05-14
Vous devez vous connecter pour publier un commentaire.
J'ai déjà eu exactement la même exigence pour la pagination, et j'ai été capable de le faire fonctionner à l'aide de CodeIgniter Enregistrement Actif.
Tout d'abord, définissez l'option
SQL_CALC_FOUND_ROWS
comme un pseudo dans la colonne select, et jeu échapper à la requête de faux:Puis, après l'exécution de votre requête avec le limit et offset en place d'attribuer les résultats à un retour de tableau:
Enfin, une seconde requête pour obtenir la trouvé les lignes et aussi assigner au tableau. Je suis l'aide de la méthode de chaînage ici pour tout faire en une seule étape.
Et de retourner le résultat et le nombre de lignes du tableau.
Vous êtes mes héros pour aujourd'hui 🙂
Héros de la journée !!!
Si vous êtes en utilisant des objets de résultat (
custom_result_object()
), il pourrait être un problème, que l'instruction select ajoute une autre propriété de la ligne des objets/des tableaux. Dans ce cas, vous pouvez effectuer les opérations suivantes:$sql = $this->db->get_compiled_select(); $sql = substr_replace ($sql, ' SQL_CALC_FOUND_ROWS', 6, 0); $data = $this->db->query ($sql);
Le reste se passe la même chose que @Wolf suggère.OriginalL'auteur Wolf
D'une façon que je peux penser est d'avoir la variable $count lorsque vous appelez votre fonction, et il va quelque chose comme ceci:
fonction your_function($count = FALSE) {
De cette façon, vous pouvez appeler la fonction en deux temps - une pour le comte et l'autre pour la limite de requête:
J'ai réussi à trouver la cause et solution similaire à la vôtre: link
J'ai vu qu'un, mais du mal à utiliser SQL_CALC_FOUND_ROWS, probablement en raison de la complexité de la requête que j'utilise
Hmmm, peut-être que vous devriez aller avec les classiques de la requête, au lieu de CI active record. Je suppose que cette façon, vous pouvez gérer pour insérer SQL_CALC_FOUND_ROWS.
J'ai converti le classique de la requête d'enregistrement active parce que je devais arrêter de CI, de l'application de backticks à la requête, ce qui n'est de toute façon, même s'il est écrit comme un classique de la requête, mais vous pouvez éviter cela en utilisant le paramètre facultatif dans l'enregistrement actif
OriginalL'auteur Sasha