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 :

Requête trop complexe pour moi


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut Requête trop complexe pour moi
    Bonjour et merci de lire ce sujet ^^ J'espère vraiment un coup de main là-dessus!

    Voilà, j'ai 2 tables: 'client' et 'checklist'.

    J'aimerais faire un SELECT sur la table 'client' en récupérant seulement:

    Ceux dont la colonne 'client.debut' <= NOW() // Ca j'y arrive
    ET (qui n'ont pas d'équivalence dans 'checklist' // 'client.id' = 'checklist.client'
    OU qui ont une équivalence mais 'checklist.bilan' IS NULL)

    J'arrive à récupérer facilement les lignes qui ont une équivalence avec 'bilan' IS NULL, mais je ne sais pas comment exprimer le fait que je veux aussi toutes les lignes de 'client' qui n'ont pas d'équivalence dans 'checklist'.

    Je sens que c'est un truc évident, mais je me prends la tête depuis hier sans succès...

  2. #2
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

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

    Essayez comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cl.*
    FROM client cl
    LEFT JOIN checklist ch ON cl.id = ch.client AND ch.bilan IS NOT NULL
    WHERE cl.debut <= NOW()
    AND ch.id IS NULL
    Ne connaissant pas la clé primaire de checklist, j'ai considéré qu'elle correspondait à une colonne nommée "id". A adapter à votre cas.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Merci! Ca marche (j'ai juste du modifier le "IS NOT NULL en IS NULL": c'est quand la colonne a la valeur NULL que ça m'intéresse!).
    En fait le "truc" c'est AND ch.id IS NULL, c'est parfait!

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Heu non en fait, je me suis emballé trop vite...
    Cette requête me récupère quand même les lignes qui ont une équivalence dans 'ch' avec un 'bilan' IS NOT NULL. Alors que moi je cherche à n'avoir que les 'bilan' IS NULL. Voilà ce que ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT cl.*
    FROM client cl
    LEFT JOIN checklist ch ON cl.id = ch.client AND ch.bilan IS NULL
    WHERE cl.debut <= NOW()
    	AND ch.id IS NULL
    J'ai l'impression que ce "LEFT JOIN" me ramène toutes les lignes qui correspondent à la clause WHERE, en rajoutant éventuellement la table 'ch' s'il y a équivalence.
    Or moi je cherche à ne PAS RECUPERER les lignes de 'cl' qui ont une équivalence dans 'ch' dont 'bilan' IS NOT NULL.

  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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    La requête que j'ai donnée renvoie, théoriquement, tous les clients qui ne sont pas dans checklist, ainsi que tous les clients qui sont dans checklist et pour lesquels le bilan est NULL.
    Ce n'est pas ce que vous souhaitiez ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Merci Ced,

    Non, en fait tous les clients sont par défaut dans la table 'client', seulement quelques-uns sont aussi dans la table 'checklist'.

    J'aimerai récupérer seulement ceux qui ne sont pas dans 'checklist' ou qui y sont mais pour qui la colonne 'checklist.bilan' a la valeur NULL.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT -- les colonnes nécessaires et pas étoile !
    FROM client cl
    LEFT OUTER JOIN checklist ch ON ch.client = cl.id
    WHERE ch.client IS NULL
    	OR ch.bilan IS NULL
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Merci! Mais tu ne veux pas plutôt dire
    ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Bon! Ca ça a l'air de marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT cl.prenom, cl.nom
    FROM client cl
    LEFT OUTER JOIN checklist ch ON ch.client = cl.id
    WHERE cl.debut <= NOW()
    	AND (ch.id IS NULL
    		OR ch.bilan IS NULL)

  10. #10
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Euh... Je persiste et je signe (peut-être dans l'erreur), mais ma requête est supposée faire ça...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Oui ça marche aussi avec ta requête.

    En fait j'ai simplifié puisque 'bilan' IS NULL veut dire:
    1) la ligne existe dans la table 'checklist' mais la colonne 'bilan' IS NULL
    2) la ligne n'existe pas dans la table 'checklist'

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cl.prenom, cl.nom
    FROM client cl
    LEFT OUTER JOIN checklist ch ON ch.client = cl.id
    WHERE cl.debut <= NOW()
    	AND ch.bilan IS NULL
    Et ça marche nickel!
    Merci à vous deux!!

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

Discussions similaires

  1. Besoin d'aide sur un select trop complexe pour moi
    Par Oribiahn dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 15h22
  2. UPDATE/SELECT un peu trop complexe pour moi
    Par Yateri dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2010, 15h17
  3. Requête trop complexe pour moi
    Par snips67 dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/01/2010, 09h24
  4. Tri complexe trop complexe pour moi
    Par nemo67 dans le forum Développement
    Réponses: 4
    Dernier message: 18/12/2009, 14h03
  5. Une requête trop complexe pour moi
    Par prgasp77 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/01/2009, 17h12

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