Page 1 sur 1

requête récursive

Posté : 01 sept. 2008, 13:14
par mcorgnet
(mysql 5, wamp, php5)

Bonjour,

j'essaie d'obtenir une liste d'éléments dans une table, et la liste des enfants associés dans la même table. Chaque élément enfant contient l'identifiant du parent dans un champ. Les éléments qui n'ont pas de parent ont le champ "parent" à 0.

La requête que j'ai actuellement :

Code : Tout sélectionner

SELECT MONTH(R.date_releve) AS num_month, C.numero, SUM(R.total) FROM releves R, compteurs C, sites S WHERE R.compteur_id = C.numero AND C.site_id = S.id AND YEAR(R.date_releve) = 2007 AND C.parent = 0 AND S.id = 4 GROUP BY num_month, C.numero ORDER BY C.numero, num_month
C'est dans la table "compteurs" que se trouve la notion de "parent". Chaque compteur peut avoir un ou plusieurs enfants, mais un seul parent.

J'ai besoin, dans cette requête, de renvoyer :

La liste des compteurs principaux (pas d'enfants) -> ok
La liste des compteurs enfants (récursivité)
Les mois ou ont été effectués un prélèvement sur ces compteurs -> ok
La somme des prélèvements par mois pour une année -> ok

Il me manque, finalement, ce qui me semble le plus compliqué : la récursivité.

Pour information :

compteurs(id, numero, numero_serie, marque, diametre, annee_fab, alimentation, archive, site_id, parent)

Code : Tout sélectionner

CREATE TABLE `compteurs` ( `id` int(11) NOT NULL auto_increment, `numero` varchar(20) NOT NULL, `numero_serie` varchar(20) NOT NULL, `marque` varchar(25) default NULL, `diametre` int(10) default NULL, `annee_fab` year(4) default NULL, `alimentation` varchar(255) default NULL, `archive` tinyint(1) default NULL, `site_id` int(11) NOT NULL, `parent` int(11) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `numero` (`numero`,`numero_serie`) )
Si vous pouvez m'aider, je vous en remercie grandement, car j'essaie d'éviter de passer par plusieurs requêtes afin d'alléger l'application.

EDIT

Voici ce que j'obtiens actuellement :

Code : Tout sélectionner

mois compteur total 1 96240778 1 2 96240778 1 3 96240778 1 4 96240778 1 5 96240778 1 6 96240778 3 7 96240778 15 9 96240778 1 7 D21 Bo 1.1 1
Il me manque, entre compteur et total, la liste des sous compteurs (compteurs ayant pour parent le compteur dans la colonne un cran à gauche).

Merci à vous.

Posté : 01 sept. 2008, 14:27
par Sékiltoyai
Amha, il faut passer par des procédures stockées…

Posté : 01 sept. 2008, 15:05
par mcorgnet
Bonjour, et merci de ta réponse.

Après avoir discuté de tout ça en privé avec Cyrano, et avoir travaillé un peu toute la requête, j'obtiens ça :

Code : Tout sélectionner

SELECT S.id AS site, YEAR( R.date_releve ) AS annee, MONTH( R.date_releve ) AS mois, C_p.numero AS parent, C_e.numero AS enfant, SUM( R.total ) AS somme FROM compteurs C_p LEFT OUTER JOIN compteurs C_e ON C_p.id = C_e.parent LEFT OUTER JOIN releves R ON C_p.numero = R.compteur_id LEFT OUTER JOIN sites S ON S.id = C_p.site_id WHERE ( YEAR( R.date_releve ) = 2007 OR YEAR( R.date_releve ) IS NULL) AND S.id = 4 GROUP BY mois, parent, enfant ORDER BY enfant DESC, parent DESC, mois
Pour l'instant, ça répond à mes besoins.

Merci néanmoins de ton intervention ;)

Bon courage.