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 :

[mySQL5] Faire une sorte de "boucle" dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut [mySQL5] Faire une sorte de "boucle" dans une requête
    Bonjour à tous

    j'ai une table qui contient des produits, l'id primaire étant le numéro du produit.
    Un produit peut être remplacé par un nouveau.
    J'ai donc un champ "substitut" qui contient l'id qu'il remplace
    ex :
    ID - LIBELLE - SUBSTITUT
    4568 - trousse de toilette -
    4569 - serviette de bain -
    4570 - trousse de toilette - 4568

    Pour le moment j'ai une table "dossier_contenir" qui contient le numéro du dossier (id) et tous les articles présents dans ce dossier
    ex :
    DOSSIER - ARTICLE
    1 - 4568
    2 - 4569

    Or mon produit 4568 est aujourd'hui remplacé par le 4570.

    Pour le moment j'arrive très bien à gérer ça avec des boucles en php (en cherchant le produit le plus récent) mais pour des raisons X j'aimerais savoir si il est possible de gérer ça directement avec une requête.
    En sachant que mon produit peut-être "substitué x fois", le 4568 est remplacé par le 4570 qui lui même est remplacé par le 4575, qui est remplacé par le 4590, etc etc etc.
    Au final si j'ai dans mon dossier le 4568 il doit m'afficher le 4590 ...

    Comme je dis précédemment je le gère en php mais si un possibilité s'ouvre à moi pour le faire directement dans la requête je suis preneur à 100%.

    Merci d'avance

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    J'ai bien compris ta problématique mais je ne crois pas qu'UPDATE sache se montrer récursif.
    Essaye cela:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE dossier_contenir 
    SET ARTICLE=(SELECT SUBSTITUT FROM produits
    WHERE ID=ARTICLE)
    Mais je serais surpris que cela fonctionne.
    La bonne idée serait de mettre un trigger AFTER UPDATE sur la table produits qui irait mettre à jour dossier contenir chaque fois que tu modifies une colonne SUBSTITUT, avec un danger (inhérent à ce choix de modélisation): comment répercutes-tu la suppression d'un SUBSTITUT sur la table dossier_contenir ?

  3. #3
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut
    à la suppression d'un produit (pas de suppression en définitive mais plutôt une variable "vivant" qui passe de 1 à 0) le produit n'est pas supprimé de "dossier_contenir" mais seulement "pas affiché".
    Ce qui permet, si un jour le produit est remplacé, d'afficher automatiquement le produit dans la page du dossier

    par contre tu me parles d'un "update"

    pour moi il s'agit surtout de la vérif sur le "select"

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Sur un seul niveau de substitution, ça donne qqch comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(S1.ID, T0.ID) AS ID, COALESCE(S1.LIBELLE, T0.LIBELLE) AS LIBELLE
    FROM ta_table T0
      LEFT JOIN ta_table S1 ON T0.substitut = S1.ID
    Sur deux niveaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COALESCE(S2.ID, S1.ID, T0.ID) AS ID, 
      COALESCE(S2.LIBELLE, S1.LIBELLE, T0.LIBELLE) AS LIBELLE
    FROM ta_table T0
      LEFT JOIN ta_table S1 ON T0.substitut = S1.ID
      LEFT JOIN ta_table S2 ON S1.substitut = S2.ID
    Et ainsi de suite. Comme tu vois, c'est assez lourdingue si tu ne connais pas à l'avance ton nombre de niveaux... auquel cas, tu peux opter pour une modélisation intervallaire : http://sqlpro.developpez.com/cours/arborescence/.

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par mdr_cedrick Voir le message
    par contre tu me parles d'un "update"

    pour moi il s'agit surtout de la vérif sur le "select"
    Au temps pour moi, je pensais que tu voulais mettre à jour en cascade quand il y avait un produit de substitution.
    Alors là, le parcours en arborescence à nombre de niveaux aléatoire, oui, le lien vers la gestion d'arborescence intervallaire peut être intéressant à étudier.

  6. #6
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut
    intéressant c'est sur mais pas trop de temps.

    à la base comme je l'expliquais ça fonctionne mais je voulais essayer autrement.
    je prendrais plus de temps pour étudier ça quand j'aurai du temps.

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/06/2009, 01h51
  2. Réponses: 1
    Dernier message: 22/06/2008, 23h47
  3. Réponses: 2
    Dernier message: 06/10/2007, 00h49

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