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 :

sélection liée exclusive


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Points : 101
    Points
    101
    Par défaut sélection liée exclusive
    Salut ... j'ai eu un peu de mal à trouver un titre en fait...
    j'ai un problème spécial...

    j'ai trois tables liées

    client ---> contrat ----> type de contrat

    Un client peut avoir un ou plusieurs contrats
    chaque contrat d'un client a un seul type mais un client peut avoir des contrats de type différents...

    par ex :

    mon client 1 à le contrat n°1 qui est de type A
    mon client 1 à le contrat n°2 qui est de type A
    mon client 1 à le contrat n°3 qui est de type B
    mon client 1 à le contrat n°4 qui est de type C

    mon client 2 à le contrat n°5 qui est de type A
    mon client 2 à le contrat n°6 qui est de type A

    bon... ben je cherche une requette qui permette de selectionner les clients qui n'ont que des contrats de type A parmi tous leurs contrats...

    en gros avec l'exemple ci dessus ça devrai retourner que le client 2 puisque le client 1 à au moins un contrat qui n'est pas de type A

    ça à l'air tout simple comme ça mais en fait c'est la misère
    à vot bon coeur ...
    @+

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Points : 101
    Points
    101
    Par défaut
    bon j'ai essayé des trucs comme ça mais ça plante

    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
     SELECT * , count( DISTINCT (
    type_contrat
    ) )
    FROM client
    INNER JOIN parc_materiel ON client.id_client = parc_materiel.client
    INNER JOIN contrat ON parc_materiel.contrat = contrat.id_contrat
    WHERE (
    count( DISTINCT (
    type_contrat
    ) ) =1
    )
    LIMIT 0 , 30
     
    MySQL a répondu:Documentation
    #1111 - Invalid use of group function

    /////////////////////

    ou encore
    ////////////////

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT * , count( DISTINCT (
    type_contrat
    ) ) AS ctc
    FROM client
    INNER JOIN activite_client ON client.activite_soc = activite_client.id_activite
    INNER JOIN parc_materiel ON client.id_client = parc_materiel.client
    INNER JOIN contrat ON parc_materiel.contrat = contrat.id_contrat
    WHERE ctc =1
    GROUP BY client.id_client
    LIMIT 0 , 30
     
    MySQL a répondu:Documentation
    #1054 - Unknown column 'ctc' in 'where clause'
    mais ça ne marche pas

  3. #3
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt...

    Vendredi apres midi... alors regardant rapidement...

    Pour le premier, il te dis que tu doit avoir un group by...


    Pour le 2. il te dis qu´il ne connais pas la colonne ctc...

    alors une des solutions..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GROUP BY client.id_client
    having  ctc =1
    LIMIT 0 , 30

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Points : 101
    Points
    101
    Par défaut
    ouai tu l'as dis ...vendredi apprem ... en fait je me rends compte que tous les vendredi apprem je me prends la tête avec un truc chiant ...
    là entre autre ça ne marche pas non plus ...(enfin le having marche ) car la requette générée est la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *, count( DISTINCT (type_contrat) ) ctc 
    from client 
    INNER JOIN activite_client ON client.activite_soc = activite_client.id_activite 
    INNER JOIN parc_materiel ON client.id_client = parc_materiel.client 
    INNER JOIN contrat ON parc_materiel.contrat = contrat.id_contrat 
    where 1=1 AND ( type_contrat=1 OR 1=2 ) 
    GROUP BY client.id_client 
    HAVING ctc =1
    et forcément comme je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ( type_contrat=1 OR 1=2 )
    si je veux lister les clients qui n'ont que des contrats de type 1

    ou bien un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ( type_contrat=3 OR type_contrat=6 OR type_contrat=5 OR 1=2 )
    pour lister des clients qui n'ont que des contrats de type 3 5 ou 6

    eh bien mon having sera toujours égal au nombre de types de contrats recherchés puisque la selection porte là dessus ...

    ola ...tiens j'ai les orielles qui fument là ... je crois qu'on verra ça lundi ...
    en tout cas merci pour la (ou les à venir) piste(s)
    @+

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    La requête suivante n'est pas forcément adaptée à ton schéma (apparemment, tu as en plus une table activite et une table parc_materiel), et les colonnes ne correspondent pas forcément tout-à-fait, mais elle donne la liste des clients qui n'ont que des contrats de type A (dans un schéma client/contrat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct c.id_client
    from client c
    inner join contrat t1 on c.id_client = t1.id_client
    where not exists (
    select 1
    from client c1
    inner join contrat t2 on c1.id_client = t2.id_client
    where c1.id_client = c.id_client
    and t2.type_contrat <> 'A')
    ced

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Points : 101
    Points
    101
    Par défaut
    Yes merci ...j'ai fait quelques tests je devrai m'en sortir à partir de ton shéma... en revanche je n'arrive pas à comprendre la logique de cette requête... bon elle marche mais je ne sais pas comment
    j'aimerai bien comprendre !
    @+

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Voilà donc quelques petites explications : je ne sélectionne que les id_clients différents (d'où mon DISTINCT) pour lesquels il n'existe pas (d'où le NOT EXISTS) de client qui a le même ID (c1.id_client = c.id_client), donc lui-même, avec un contrat de type autre que A.
    Bref, je ramène donc les clients qui n'ont que des contrats de type A.
    Est-ce que c'est plus clair, comme ça ?

    ced

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 248
    Points : 101
    Points
    101
    Par défaut
    yess !! excellent
    merci
    @++

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

Discussions similaires

  1. Sélections et exclusions d'individus
    Par pacman301 dans le forum QlikView
    Réponses: 10
    Dernier message: 27/05/2015, 10h24
  2. [AC-2007] Requête sélection sur deux tables liées
    Par rogerfon dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 10/04/2010, 15h30
  3. [AJAX] Liste liée - Pré sélection
    Par RobertP dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/06/2008, 23h46
  4. Réponses: 0
    Dernier message: 21/03/2008, 16h10
  5. [Access 2003] Sélection d'un table avec exclusion
    Par morpheez dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/11/2006, 12h16

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