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 :

Left join: supprimer des references produits


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut Left join: supprimer des references produits
    bonjour,
    j'essaie de faire une requete afin de selectionner des utilisateurs qui ont une reference produit et n'ont pas un autre produit, le tout avec une jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT C.*, L.*, E.*
    FROM clients C
    LEFT JOIN licenses L ON (L.client_id = C.ClientID)
    LEFT JOIN emails E ON (E.clientID = C.ClientID)
    WHERE L.status = 'ACTIVE'
    AND L.TYPE = 'FULL'
    AND E.InUse=1 
    AND C.NoMailingList=0
    AND L.product_id = 12
    AND L.product_id != 17
    je veux donc les utilisateurs qui possedent la reference 12 (product_id = 12) et qui n'ont pas la 17 mais ca ne marche pas, avec ou sans la condition AND L.product_id != 17 ca ne change rien

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    que veut dire "ça ne marche pas" ? Tu as un message d'erreur ? ou bien les résultats ne te plaisent pas ?

  3. #3
    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
    Par défaut
    Citation Envoyé par boobi31 Voir le message
    bonjour,
    j'essaie de faire une requete afin de selectionner des utilisateurs qui ont une reference produit et n'ont pas un autre produit, le tout avec une jointure:
    je veux donc les utilisateurs qui possedent la reference 12 (product_id = 12) et qui n'ont pas la 17 mais ca ne marche pas, avec ou sans la condition AND L.product_id != 17 ca ne change rien
    Saluton,
    Il va falloir t'orienter vers NOT EXISTS auquel tu associeras une sous-requête corrélée sur l'ID du client.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    En théorie, il faudrait remplacer AND L.product_id != 17 par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND NOT EXISTS (SELECT 1 
      FROM licenses L2 
      WHERE L2.client_id = C.ClientID AND L.product_id = 17
    )
    Maintenant, ça dépend de ce qui ne marche pas exactement...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    la requete fonctionne bien apres c'est le resultat qui n'est pas bon, il n'existe pas une fonction plus simple qu'une sous-requete?

    je viens d'essayer ca mais ca ne me prend toujours pas en compte le sous ensemble des product_id different de 17:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT C.*, L.*, E.*
    FROM clients C
    LEFT JOIN licenses L ON (L.client_id = C.ClientID)
    LEFT JOIN emails E ON (E.clientID = C.ClientID)
    WHERE L.STATUS = 'ACTIVE'
    AND L.TYPE = 'FULL'
    AND E.InUse=1 
    AND C.NoMailingList=0
    AND L.product_id = 12
    AND NOT EXISTS (SELECT 1 
      FROM licenses L2 
      WHERE L2.client_id = C.ClientID AND L.product_id = 17
    )

  6. #6
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par boobi31 Voir le message
    il n'existe pas une fonction plus simple qu'une sous-requete?
    Pour la non existence, le plus explicite est la clause NOT EXISTS (curieusement). La seule alternative est un LEFT JOIN avec en clause de jointure le WHERE de la sous-requête et dont on vérifiera qu'il renvoie NULL. C'est potentiellement plus rapide (encore que), mais pas vraiment plus clair.

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par boobi31 Voir le message
    la requete fonctionne bien apres c'est le resultat qui n'est pas bon, il n'existe pas une fonction plus simple qu'une sous-requete?

    je viens d'essayer ca mais ca ne me prend toujours pas en compte le sous ensemble des product_id different de 17:
    Peux-tu nous montrer un extrait de tes résultats, et nous dire en quoi ça ne te va pas ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Par défaut
    au lieu d'utiliser EXISTS j'ai fait une sous requete et ca fonctionne merci

  9. #9
    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
    Par défaut
    Citation Envoyé par boobi31 Voir le message
    ...les utilisateurs qui possedent la reference 12 (product_id = 12) et qui n'ont pas la 17...
    Ta demande initiale a changé alors ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Left join avec les résultats des trois requêtes
    Par ghatfan99 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/07/2011, 10h28
  2. LEFT JOIN et les places des tables dans la condition
    Par moukit233 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/01/2010, 09h08
  3. [AC-2003] Requete sur une table avec des "Left Join" en parallèle
    Par Currahee dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/08/2009, 09h37
  4. Imbriquer des LEFT JOIN ?
    Par le_sonic dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2007, 16h45
  5. Creer une requete avec des LEFT JOIN et des GRO
    Par donbuz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2004, 15h53

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