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 :

Lister des commandes contenant seulement 1 produit précis


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Par défaut Lister des commandes contenant seulement 1 produit précis
    Bonjour,

    Je fais appel à vous, car je bloque sur une requête.
    J'arrive à faire en plusieurs requêtes, ce que je vais vous décrire, mais étant au milieu d'une boucle for PHP, j'arrive vite à 5000 requêtes sur ma page et ça ne me plait pas du tout !

    J'ai une table "commande" contenant un id (int), un fournisseur (varchar) et une date (date)
    J'ai également une table "contenu" contenant l'id de la commande "id_commande", un produit "id_kdo" et un prix.

    Si je veux récupérer par exemple le contenu des commandes ayant le produit 1, je fais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cont.*, com.*
    FROM contenu cont
    LEFT JOIN commande com ON com.id=cont.id_commande
    WHERE cont.id_kdo IN (1)
    GROUP BY com.id
    J'ai mis des * pour éviter le listing de tout ce que je veux
    En fait, cette requête me va, mais j'aurais besoin de récupérer les commandes contenant uniquement le produit "1", dans le dernier cas je peux avoir les produits 1, 2 et 3 et la commande sera quand même recrachée par la requête.

    En creusant, j'ai vu qu'il existe la fonction EXISTS en SQL, mais je ne sais pas si c'est ce dont j'ai besoin, et si oui je ne comprends pas trop comment l'adapter dans mon cas.

    Merci d'avance pour votre aide
    Cédric

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par cedrick21 Voir le message
    En creusant, j'ai vu qu'il existe la fonction EXISTS en SQL, mais je ne sais pas si c'est ce dont j'ai besoin, et si oui je ne comprends pas trop comment l'adapter dans mon cas.
    Vous êtes sur la bonne piste...
    Il suffit de rajouter...
    et pour cette commande IL N'EXISTE PAS de produit autre que 1
    Au passage votre GROUP BY est totalement inutile....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM   contenu AS cont
           LEFT OUTER JOIN commande AS com 
    	        ON com.id=cont.id_commande
    WHERE cont.id_kdo = 1
      AND NOT EXISTS(SELECT *                        --> il n'existe pas
                     FROM   contenu AS cont2
    				 WHERE  com.id=cont2.id_commande --> pour la même commande
    				   AND  id_kdo <> 1)             --> un produit différent de 1
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    mais étant au milieu d'une boucle for PHP, j'arrive vite à 5000 requêtes
    Cela veut-il dire que vous bouclez sur tous les id_kdo ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/08/2009, 14h53
  2. Commandes contenant des chiffres
    Par thslt dans le forum Débuter
    Réponses: 4
    Dernier message: 05/08/2009, 00h42
  3. Modélisation des commandes et produits
    Par 0coco0 dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 02/09/2008, 08h36
  4. Réponses: 3
    Dernier message: 29/01/2008, 14h28
  5. Lister des tables contenant un ou des enregistrements
    Par Evocatii dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/09/2007, 22h24

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