Sous-total

Par aouchachacha, il y a 7 ans


Bonjour,

Je développe une petite appli pour une asso étudiante, leur permettant de gérer les inscriptions à leur événement.

Je cherche à afficher un classement par nombre d'inscrits par école en précisant le nombre de diplômés parmis ces inscrits.

Voici le code pour le classement des écoles par inscrits :

$q = $this->Users->Schools->find(); $q->select([ 'total_inscrit' => $q->func()->count('Users.id'), ])->innerJoinWith('Users.EventsUsers', function ($q) use ($event_id) { return $q->where(['EventsUsers.event_id' => $event_id]); }) ->group(['Schools.id']) ->order(['total_inscrit' => 'DESC']) ->autoFields(true);

Ma difficulté est d'arriver à sortir un sous-total - proprement - avec Users.promo_id = 5

Cette requête SQL fonctionne mais elle est un peu bourrine.

SELECT ( COUNT(Users.id) ) AS `total_inscrit`, (SELECT COUNT(U.id) FROM schools SCH INNER JOIN users U ON SCH.id = U.school_id AND U.promo_id = 5 INNER JOIN events_users E ON E.event_id = 7 AND U.id = E.user_id WHERE SCH.id = Schools.id ) AS `total_DE`, Schools.id AS `Schools__id`, Schools.name AS `Schools__name` FROM schools Schools INNER JOIN users Users ON Schools.id = (Users.school_id) INNER JOIN events_users EventsUsers ON ( EventsUsers.event_id = 7 AND Users.id = (EventsUsers.user_id) ) GROUP BY Schools.id ORDER BY total_inscrit DESC

Je suis persuadé qu'il y a moyen de sortir ça avec Cakephp mais je ne trouve pas, je m'en donc remets à vos connaissances.
Merci beaucoup pour l'aide que vous pourrez m'apporter!

1 réponse

aouchachacha, il y a 7 ans

J'arrive également au bon résultat comme ça... Mais ça ne me plait toujours pas.

$q = $this->Users->Schools->find(); $q->innerJoinWith('Users.EventsUsers', function ($q) use ($event_id) { return $q->where(['EventsUsers.event_id' => $event_id]); }) ->group(['Schools.id']) ->order(['total_inscrit' => 'DESC']) ->autoFields(true); $qDE = $q; $q->select([ 'total_inscrit' => $q->func()->count('Users.id'), ]); $clt = $q->toArray(); $qDE->where(['Users.promo_id' => 5])->toArray(); $cltDE = $qDE->toArray(); foreach($clt as $a => $k) { if(isset($cltDE[$a]->total_inscrit)) { $clt[$a]['total_DE'] = $cltDE[$a]->total_inscrit; } else { $clt[$a]['total_DE'] = 0; } } return $clt;