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 :

Aide sur NOT EXISTS [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut Aide sur NOT EXISTS
    Salut,

    Voila, j'ai 2 tables

    1 - Personnel
    2 - Formation

    1 - Personnel contient
    a - dni
    b - nom
    c - prénom

    2 - Formation contient
    a - dni
    b - nom
    c - prénom
    d - TypeFomation

    J'essai tant bien que mal que mysql m'affiche le nom des personnes qui n'ont pas reçu un type de formation, comment puis-je faire pour qu'il m'affiche donc les personnes n'ayant pas reçu la formation 'Externe'

    J'ai essayer cela mais je sais pas comment place TypeFormation = 'Externe'
    Pour info dni est un identifiant de la personne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dni,nom,prenom FROM Personnel
      WHERE NOT EXISTS (SELECT * FROM Formation
                    WHERE Personnel.dni = Formation.dni)
    Merci à qui pourra m'aider.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT dni,nombre,apellidos FROM Personal
      WHERE NOT EXISTS (SELECT dni,nombre,apellidos FROM Formaciones WHERE Personal.dni = Formaciones.dni AND Formaciones.tipo_formacion='Externa') AND
      ((Personal.fecha_baja IS NULL) OR
                             (DATE_FORMAT(Personal.fecha_baja, '%Y-%m-%d') = '') OR
                             (DATE_FORMAT(Personal.fecha_baja, '%Y-%m-%d') = '0000-00-00'))

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Votre solution semble indiquer que toutes les personnes sont dans la table des formations, même celles qui n'en ont pas eu et qu'en ce cas la date de formation est à vide ou '0000-00-00'

    Ca signifie donc que la colonne date de formation n'est pas au format date, ce qui est une grave erreur de conception
    D'autre part, il y a des redondances de colonnes : nom et prénom n'ont rien à faire dans la table des formations
    Enfin faire un filtre sur un libellé est risqué, surtout quand celui-ci (Externe dans votre cas) contient à la fois des majuscules et minuscules, tester un code est préférable

    La table formation devrait être composée de id_formation, code_formation, libelle_formation
    Et vous devriez avoir une table issue de la relation entre un éleve et une formation (que je nomme Suivre_Formation ci-dessous) contenant dni (identifiant élève), id_formation, date_formation (au format date !), note_obtenue etc...

    Avec ce type de modèle corrigé, la requête devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT PE.dni
         , PE.nom
         , PE.prenom
    FROM Personnel as PE
    WHERE NOT EXISTS 
         (SELECT 1 
          FROM Suivre_Formation as SF
          INNER JOIN Formation  as FO  
             ON FO.id_formation = SF.id_formation
          WHERE SF.dni = PE.dni
            and FO.Code_Formation = 'EX')

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Merci d'avoir repondu,
    Oui est effet car sous VB au moment de sauvegarder il me met 0000-00-00 car VB me disait que date min est 01/01/1703 si je me souviens bien, d'ou ce simple filtre pour éviter d'afficher d'autres dates. Aussi c'est me premiere application.
    On apprend au fur et a mesure et s commence a rentrer.

    En effet pour la formation j'ai un autre code qui me sort qui fais le lien entre Personal.dni et Formation.dni et cela marche bien.

    Mais si je poste aussi sur le forum c'est pour pouvoir retrouver ces astuces le lendemain pour m'ameliorer.

    Merci de ton aide.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut superthx.

    Une date à '0000-00-00' n'est plus autorisé sous MySql depuis la version 5.7.
    Une date à vide signifie que vous n'utilisez pas le type "date" mais le type char pour stocker vos dates.
    Vous devez faire en sorte, lors du chargement dans votre table MySql de codifier correctement vos dates.
    Si fecha_baja est à NULL dans VBA ou à "0000-00-00" ou encore à vide, mettre dans tous les cas NULL dans MySql.

    Est-ce par un "load data local infile" que vous chargez votre table ?
    Pour ce faire, vous devez utiliser la fonction "str_to_date()" :
    --> https://dev.mysql.com/doc/refman/5.5...on_str-to-date

    Voici un exemple de conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LOAD DATA LOCAL INFILE 'fichier.txt'
         INTO TABLE `trav`
         CHARACTER SET latin1
         FIELDS TERMINATED            BY ';'
                OPTIONALLY ENCLOSED   BY '\"'
                ESCAPED               BY '\\'
         LINES  TERMINATED            BY '\r\n'
         IGNORE 0 LINES
         (@F1, @F2, @F3)
         set col_num  = trim(@F1),
             col_date = str_to_date(trim(@F2), '%d/%c/%Y %H:%i:%s'),
             lib      = trim(@F3);
    Ce n'est pas dans votre requête que vous devez faire des conversions, mais bien au moment du chargement de votre table.
    Du coup, cela va simplifier grandement votre requête.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 31/01/2015, 19h50
  2. IF NOT EXISTS et SELECT sur clé primaire
    Par Nikimizi dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/10/2013, 16h27
  3. not exists sur Insert into
    Par Nikimizi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/06/2013, 11h03
  4. [MySQL] Requête sur table de jointure avec not in ou not exists
    Par GueloSuperStar dans le forum Langage SQL
    Réponses: 12
    Dernier message: 08/03/2013, 15h01
  5. Doute sur une requête NOT EXISTS
    Par CinePhil dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/03/2009, 12h00

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