IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête récursive


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut Requête récursive
    Bonjour,

    J'espère que vous pourrez m'aider, j'ai un problème que je cherche à résoudre soit par mysql soit par php.
    Je gère un fichier des produits et chaque produit est rattaché à une catégorie de produit.
    genre j'ai un produit batterie iphone 10 rattaché à une catégorie "version 10" car les catégories sont gérées comme un arbre. La catégorie du produit "version10" a pour catégorie mère "iphone" qui elle même a pour catégorie mère la catégorie batterie.

    Je dois pouvoir en une requête sortir les produits qui ont comme catégorie mère principale la catégorie "batterie" mais cela impliquerait une requête mysql récursive et je ne sais pas si on peut faire ça avec mysl

    Sinon une autre solution consisterait à utiliser php pour lire mon fichier des associations de catégories et remplir une liste (select) avec toutes les catégories :

    id categorie_mere id categorie_fille
    72 15
    15 11
    15 10
    11 6

    ça ferait :

    72-15-11-6
    72-15-10

    La valeur que je stockerais dans mon select sera l'identifiant de la dernière catégorie donc 6 puis 10 donc celle qui est stocké dans le fichier des produits donc la recherche se fera directement

    HELP

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 963
    Par défaut
    Bonsoir,

    La récursivité chez MySQL arrive avec la version 8.0

    Sinon voir l'algorithme intervallaire de SQLpro sur ce même site.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Si le nombre de niveaux est limité (3 maxi par exemple) vous pouvez vous en sortir sans requête récursive en autant de jointures que de niveaux avec un alias de table pour chaque niveau
    Sinon, sous réserve que vous ayez MySQL, V8.0 vous pouvez jeter un coup d'oeil dans ce sujet dans lequel je donne un exemple de requête récursive

    https://www.developpez.net/forums/d1.../#post11001213

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut à tous.

    Citation Envoyé par pas30
    ça ferait :
    Vous désirez obtenir le résultat sous cette forme ??? Bizarre car c'est inexploitable pour des calculs.
    Vu que votre demande est sous cette forme, je vous donne le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    ( `mere`    integer  unsigned  not null,
      `fille`   integer  unsigned  not null,
      primary key (`mere`,`fille`),
      index `idx1` (`fille`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `test`
    --------------
     
    --------------
    CREATE PROCEDURE `test`(IN _i int, IN _c varchar(255))
    BEGIN
            DECLARE _fin INTEGER DEFAULT 1;
            DECLARE _z   INTEGER DEFAULT 0;
            DECLARE _tab CURSOR FOR SELECT fille FROM test WHERE mere = _i;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
            OPEN _tab;
            FETCH _tab INTO _z;
     
            IF (_FIN) THEN
                    set _c = concat(_c,_i,'-');
            ELSE
                    set _c = concat(_c,_i);
                    select _c;
            END IF;
     
            WHILE (_fin)
            DO
                    CALL test(_z, _c);
     
                    FETCH _tab INTO _z;
            END WHILE;
     
            CLOSE _tab;
    END
    --------------
     
    --------------
    INSERT INTO `test` (`mere`,`fille`) VALUES
      (72, 15),
      (15, 11),
      (15, 10),
      (11, 6)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +------+-------+
    | mere | fille |
    +------+-------+
    |   11 |     6 |
    |   15 |    10 |
    |   15 |    11 |
    |   72 |    15 |
    +------+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    call `test` (72,'')
    --------------
     
    +----------+
    | _c       |
    +----------+
    | 72-15-10 |
    +----------+
    +------------+
    | _c         |
    +------------+
    | 72-15-11-6 |
    +------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

Discussions similaires

  1. Requête récursive dans access
    Par Australia dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 29/07/2014, 15h15
  2. Réponses: 4
    Dernier message: 04/05/2006, 19h01
  3. [SQL Server]Problème avec une requête récursive
    Par evans dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 20h16
  4. [SQL Server] Requête récursive
    Par margagn dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2006, 04h31
  5. Requête récursive
    Par tirixil dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/03/2005, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo