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

Langage SQL Discussion :

Requête SQL trop compliquée pour moi


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Requête SQL trop compliquée pour moi
    Bonjour,

    Alors voilà le topo :
    une table produits
    champs : id_produit, id_variante, titre, quantite, id_rubrique

    Si c'est un produit de base, id_variante=0.
    Si c'est une variante, alors id_variante sera renseigné avec l'id_produit du produit de base correspondant.

    Donc sur ma page de catalogue produits, je voudrais afficher les produits de base...ça pas de problème. Sauf que si la quantité vaut 0 il ne faudrait pas afficher le produit, à moins qu'une des variantes du produit ait une quantité supérieure à zéro. C'est là que je coince !

    Quelqu'un aurait la syntaxe d'une telle requête ou au moins la direction dans laquelle je dois m'orienter ?

    En pièce jointe, une capture d'écran d'une table test avec un essai pas très concluant de requête.

    Merci d'avance.

    Samy.
    Images attachées Images attachées  

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * 
    FROM Produits T1
    WHERE T1.id_variante = 0
    AND (	quantite > 0 
    	OR
    	EXISTS (SELECT 1 
    		FROM Produits
    		WHERE id_variante = T1.Id_produit
    		AND quantite > 0
    		)
     
    	)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    C'est pas mal comme requête, je connaissais pas l'utilisation du EXISTS.

    Par contre, ça me renvoie mes 3 produits de base, serait-il possible d'avoir les 2 produits de base non épuisé et au lieu du 3ème avoir une de ses variantes ?

    Je pense que je pourrais m'en sortir avec cette requête au niveau de ma boucle :
    Si le produit de base est épuisé, je refais une p'tite requête (dans la boucle) pour trouver la première variante disponible (puisqu'elle existe il n'y aura pas de problème d'emplacement vierge).
    => seul souci, c'est le tri, car dans la requête principale je ne pourrais pas faire ORDER BY prix vu que ce sera toujours trié sur des produits de base et non sur les variantes éventuellement affichées.

    En tout cas, merci pour cette première solution !

    @+! Samy

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par goldenboy68 Voir le message
    C'est pas mal comme requête, je connaissais pas l'utilisation du EXISTS.

    Par contre, ça me renvoie mes 3 produits de base, serait-il possible d'avoir les 2 produits de base non épuisé et au lieu du 3ème avoir une de ses variantes ?

    Je pense que je pourrais m'en sortir avec cette requête au niveau de ma boucle :
    Si le produit de base est épuisé, je refais une p'tite requête (dans la boucle) pour trouver la première variante disponible (puisqu'elle existe il n'y aura pas de problème d'emplacement vierge).
    => seul souci, c'est le tri, car dans la requête principale je ne pourrais pas faire ORDER BY prix vu que ce sera toujours trié sur des produits de base et non sur les variantes éventuellement affichées.

    En tout cas, merci pour cette première solution !

    @+! Samy
    Un peu plus propre, et plus proche de votre besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Base.Id_Produit as Id_Base, Base.Quantite  as Qte_Base, Variante.Id_Produit as Id_Variante, Variante.Quantite as Qte_Variante
    FROM Produits Base
    	LEFT JOIN Produits Variante 
    		ON Base.Id_Produit = Variante.Id_Variante
    		AND Base.Quantite = 0
     
    WHERE Base.id_variante = 0
    AND (	Base.quantite > 0 
    	OR 
    	Variante.Quantite > 0
        )
    ORDER BY Base.Id_Produit
    Affiche les id_produit qui sont disponibles ou pour lesquels on a une variante disponible. Si le produit est dispo, il y aura du NULL dans les colonnes de la variante. Si le produit n'est pas dispo et a des variantes dispo, il y aura autant de lignes avec le produit de base identique et chaque variante disponible.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Telle quelle la requête renvoie une erreur dans Access, jointure non acceptée

    En enlevant "AND Base.Quantite = 0", ça passe, mais ça renvoie toujours pas ce qui était espéré.

    En fait il faudrait les produits de base + 1 variante disponible du produit de base si celui-ci est épuisé...

    Autre suggestion ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Petite limitation d'access sur la clause de jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Base.Id_Produit AS Id_Base, Base.Quantite  AS Qte_Base, Variante.Id_Produit AS Id_Variante, Variante.Quantite AS Qte_Variante
    FROM Produits Base
    	LEFT JOIN Produits Variante 
    		ON Base.Id_Produit = Variante.Id_Variante
     
    WHERE Base.id_variante = 0
    AND (	Base.quantite > 0 
    	OR 
    	Variante.Quantite > 0
        )
    AND NOT (Variante.Quantite > 0 AND Base.quantite > 0)
    ORDER BY Base.Id_Produit
    Je pense que cette version devrait contourner la limitation

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par vmolines Voir le message
    1) Tu postes dans le sujet d'une autre personne qui n'a rien à voir avec le tien
    2) Tu répètes ton message alors qu'il existe déjà, c'est inutile et pénible

    Crées ton propre sujet pour ton problème
    désolé

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Voilà la requête "légèrement" modifiée que j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Base.Id_Produit AS Id_Base, Base.Quantite  AS Qte_Base,
     Variante.Id_Produit AS Id_Variante, Variante.Quantite AS Qte_Variante
    FROM Produits as Base LEFT JOIN Produits as Variante ON Base.Id_Produit = Variante.Id_Variante
    WHERE (Base.id_variante = 0 AND Base.quantite > 0) OR (Variante.Quantite > 0)
    AND NOT (Variante.Quantite > 0 AND Base.quantite > 0)
    ORDER BY Base.Id_Produit
    Quelques problèmes quand même :
    - ça me renvoie les 2 variantes du produit de base 1 alors qu'il n'est pas épuisé
    => il ne faudrait que le produit de base 1 et pas les variantes ici
    - ça renvoie les 3 variantes du produit de base 3
    => il faudrait qu'il n'y en ait qu'une seule

    Encore une p'tite idée ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    J'suis parti sur la première requête proposée qui se rapprochait au mieux de ce qu'il me fallait.

    Dans ma boucle j'ai rajouté un test, si quantite=0 alors je refais une requête sur produits en cherchant la première variante du produit de base épuisé.

    Ca marche nickel ! Merci pour le temps passé sur mon problème.

    @+! Samy

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

Discussions similaires

  1. une requête multiple trop compliquée pour moi
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 23h38
  2. [Mail] mail trop compliqué pour moi
    Par tremeur53 dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2008, 16h05
  3. [Requête SQL]Trop longue pour une ligne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2008, 15h27
  4. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 23h52
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 16h17

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