24 mars 2003

Comment écrire une requête récursive avec MySQL ?

Une représentation hiérarchie dans une table consiste à stocker pour chaque enregistrement l'identifiant de son père.

Par exemple pour représenter cette hiérarchie :

  • Europe
    • France
      • Lorraine
      • Alsace
    • Allemagne
      • Ruhr
      • Saar

On utilisera une table de ce style :

id libelle id_pere
1 Europe -
2 France 1
3 Allemagne 1
4 Alsace 2
5 Lorraine 2
6 Ruhr 3
7 Saar 3

Maintenant comment récupérer cette hiérarchie ? A ce que je sache, actuellement avec MySQL?, on ne peut pas le faire en une seule requête SQL (contrairement à ORACLE). Par conséquence, il nous faut ruser en utilisant une fonction récursive.

En PHP cela nous donne :

<?php

function select_recursif($id_pere = null)
{
  $rows = array();
  $i = 0;
  $requete = "SELECT * FROM matable WHERE id_pere";
  $requete .= ($id_pere == null) ? ' is null' 
                                 : ' = '.$id_pere;
  $res = $GLOBALS['db']->query($requete);
  while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
    $rows[$i] = $row;
    $rows[$i]['fils'] = select_recursif($row['for_idt']);
    ++$i;
  }
  $res->free();

  return ((!$i) ? null : $rows);
}

require_once('DB.php');

$db = DB::connect('mysql://root:@localhost/mabase', true);
if (DB::isError($db)) die($db->getMessage());

print_r (select_recursif());

?>

2 commentaires:

  1. Bonjour,

    N'existe-t-il vraiment pas de solution afin d'executer une sorte de requête récursive MySQL retournant l'ensemble des résultats d'un arbre, jusqu'a la racine :)

    RépondreSupprimer
  2. Avec Postgresql, c'est possible => https://charlycoste.wordpress.com/2011/12/26/arborescences-et-postgresql/

    RépondreSupprimer