Il peut arriver que vous ayez besoin lors d’une requête SQL de compter le nombre de lignes suivant plusieurs paramètres. Ce n’est pas possible avec un simple « COUNT » il va donc falloir être plus subtile.
Imaginons que l’on a une table de la forme :
| id | statut | nom |
|---|---|---|
| 1 | 0 | aaaaaaaa |
| 2 | 1 | bbbbbbb |
| 3 | 0 | ccccccc |
| 4 | 2 | dddddd |
| 5 | 1 | eeeeee |
| 6 | 1 | fffffffff |
Pour connaitre le nombre de lignes où le statut est à 0, un COUNT classique suffit :
SELECT COUNT(id) FROM table WHERE statut = 0;
Cette requête va simplement compter le nombre de ligne où le champ « statut » est à 0, et va renvoyer 2 dans notre cas.
Mais comment faire si on veut compter le nombre de lignes où le statut est égale à 0, mais aussi à 1 et 2, tout ça dans la même requête ? Et bien il faut utiliser une structure conditionnelle pardi. C’est du SQL donc ça marche aussi bien avec MySQL que PostgreSQL ou autres.
SELECT SUM(CASE statut WHEN 0 THEN 1 ELSE 0 END), SUM(CASE statut WHEN 1 THEN 1 ELSE 0 END), SUM(CASE statut WHEN 2 THEN 1 ELSE 0 END) FROM table GROUP BY statut
Cette requête va nous renvoyer le nombre de lignes qui ont un statut à 0, puis 1 et 2. Attention à bien utiliser un « GROUP By » autrement les résultats renvoyés vont être faussés.
Avec CakePHP ça va s’écrire comme ça :
$this->Model->find('all', array(
'fields' => array(
'SUM(CASE Model.statut WHEN 0 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 1 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 2 THEN 1 ELSE 0 END)',
),
'group' => array('Model.statut'),
));
En esperant que ça aide !