J'ai une table mySQL comme ceci:PHP + MySQL: Trouver au total des valeurs par récursion par groupes d'enfants de parents mySQL
Dossiers
[id] [name] [parent_id]
1 fruits 0
2 orange 1
3 lemon 2
4 steak 0
Projets
[id] [name] [parent_id] [hours]
1 project1 1 3
2 project2 2 4
3 project3 3 6
4 project4 4 7
Fondamentalement, les projets peuvent s'asseoir dans des dossiers différents. le parent_id des projets est l'identifiant du dossier. Les dossiers peuvent avoir des sous-dossiers et les projets peuvent résider dans des sous-dossiers. Et il y a un nombre illimité de sous-dossiers.
Le résultat que je voudrais obtenir est de trouver le nombre total d'heures dans un dossier et tous ses sous-dossiers. Donc, en passant par le dossier et en trouvant tous les dossiers des enfants dans ce dossier (et continuez jusqu'à ce qu'il atteigne le niveau le plus profond) et en ajoutant toutes les heures pour tous les projets dans chacun de ces sous-dossiers pour obtenir un total d'heures. Pensez-y comme une tâche ou une base de données de projets et je veux calculer le nombre total d'heures consacrées au projet.
Existe-t-il un moyen de le faire via mySQL ou PHP?
Jusqu'à présent, j'ai les informations suivantes pour mySQL. http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
Et j'ai cette fonction PHP mais le problème est que je ne sais pas comment ajouter le total des résultats. Je ne sais pas comment ajouter un tableau sur une fonction récursive. C'est probablement faux de toute façon, mais je pensais que je vais le jeter là-bas.
function categoryChild($id) {
$s = "SELECT id FROM folders WHERE parent_id = $id";
$r = mysql_query($s);
$children = array();
$hours = array();
if(mysql_num_rows($r) > 0) {
# It has children, let's get them.
while($row = mysql_fetch_array($r)) {
# Add the child to the list of children, and get its subchildren
$ee['id'] = categoryChild($row['id']);
$newid = $row['id'];
$sql = "SELECT SUM(b.hours) as totalhours
FROM folders a
INNER JOIN projects b ON b.folder_id = a.id
WHERE a.id = '$newid'";
$result = mysql_query($sql);
$children['hours'] = $row['totalhours'];
}
}
$s1 = "SELECT sum(hours) as totalhours FROM projects WHERE folder_id = $id";
$r1 = mysql_query($s1);
if(mysql_num_rows($r1) > 0) {
while($row3 = mysql_fetch_array($r1)) {
$children['hours'] = $row3['totalhours'];
}
}
$data = $data['hours'];
return $data;
}
Avez-vous étudié l'utilisation de jeux imbriqués comme décrit dans le lien mysql que vous avez là? Le modèle des ensembles imbriqués serait un bon ajustement si vous avez une application de lecture lourde mais perd son efficacité si vous devez faire beaucoup d'écritures par rapport aux lectures. – rojoca
Je préfère utiliser une table de fermeture. Voir [les diapositives de Bill Karwin] (http://www.slideshare.net/billkarwin/models-for-hierarchical-data), il inclut un exemple de recherche d'arborescence profonde pour le modèle de contiguïté, et des alternatives possibles pour votre configuration actuelle. – Wrikken