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

MySQL Discussion :

Problème de jointure et condition


Sujet :

MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème de jointure et condition
    Bonjour,

    Je cherche à faire une requête avec jointure et condition mais je ne trouve pas la bonne syntaxe. voici à quoi ressemble ma base de données quand j'affiche toutes les informations avec une jointure :
    Nom : Capture.PNG
Affichages : 238
Taille : 28,2 Ko

    Ce que je cherche à faire c'est afficher en une seule requête la liste des conteneurs dont TOUS les documents ont une année de destruction en 2017 ou moins, donc qui me retournerai les conteneurs 2 et 4. Est ce que quelqu'un pourrait m'aider sur ce coup la je vous prie?

    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    As-tu tester l'ajout du where ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select b.nom,a.*
    	from documents as a
    		left join conteneurs as b on b.id = a.conteneur
    	where a.destruction <=2017;
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour la réponse, bien sur mais ça me retourne tous les conteneurs dont au moins un document respectent la condition, hors ce que je veux c'est qu'il prenne en compte que tous les documents du conteneur respecte la condition, et pas seulement un.

    Dans ta requête le conteneur 3 va ressortir alors qu'il possède un document qui a une année de destruction en 2018 ce qui ne me va pas.

    PS: j'ai joint un backup de la base de test que j'utilise si besoin

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Dans ce cas là il te faut une sous-requête :

    Un truc dans ce style ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select b.id, a.*
    	from conteneurs b
    		left join as documents b on b.id = a.conteneur
    	where exists (select 1 from documents sub where b.id = sub.conteneur and sub.destruction <=2017) ;
    Mais dans ce cas là le plus propre est de faire plusieurs requêtes.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse,

    je viens de parvenir plus ou moins à la même solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT b.nom
    FROM documents AS a
    INNER JOIN conteneurs AS b ON b.id = a.conteneur
    WHERE (SELECT count(id) FROM documents WHERE destruction > 2017 AND conteneur = b.id) = 0
    GROUP BY b.id
    je vais essayer comme ça, merci en tout cas

    Edit

    En fait il y a plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT b.nom
    FROM documents AS a
    INNER JOIN conteneurs AS b ON b.id = a.conteneur
    HAVING MAX(a.destruction) <= 2017

  6. #6
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut klarann.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `conteneurs`
    --------------
     
    --------------
    CREATE TABLE `conteneurs`
    ( `id`   integer unsigned  NOT NULL auto_increment primary key,
      `nom`  varchar(255)      NOT NULL
    ) ENGINE=MyIsam
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `conteneurs` (`nom`) VALUES ('Conteneur 1'),('Conteneur 2'),('Conteneur 3'),('Conteneur 4'),('Conteneur 5')
    --------------
     
    --------------
    select * from `conteneurs`
    --------------
     
    +----+-------------+
    | id | nom         |
    +----+-------------+
    |  1 | Conteneur 1 |
    |  2 | Conteneur 2 |
    |  3 | Conteneur 3 |
    |  4 | Conteneur 4 |
    |  5 | Conteneur 5 |
    +----+-------------+
    --------------
    DROP TABLE IF EXISTS `documents`
    --------------
     
    --------------
    CREATE TABLE `documents`
    ( `id`          integer unsigned  NOT NULL auto_increment primary key,
      `nom`         varchar(255)      NOT NULL,
      `conteneur`   integer unsigned  NOT NULL,
      `destruction` smallint          NOT NULL,
      CONSTRAINT `FK_CONTENEURS` FOREIGN KEY (`conteneur`) REFERENCES `conteneurs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=MyIsam
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `documents` (`nom`, `conteneur`, `destruction`) VALUES
    ('document  1', 1, 2018),('document  2', 1, 2020),('document  3', 2, 2015),('document  4', 2, 2016),('document  5', 3, 2017),
    ('document  6', 3, 2018),('document  7', 4, 2017),('document  8', 4, 2015),('document  9', 5, 2014),('document 10', 5, 2020)
    --------------
     
    --------------
    select * from `documents`
    --------------
     
    +----+-------------+-----------+-------------+
    | id | nom         | conteneur | destruction |
    +----+-------------+-----------+-------------+
    |  1 | document  1 |         1 |        2018 |
    |  2 | document  2 |         1 |        2020 |
    |  3 | document  3 |         2 |        2015 |
    |  4 | document  4 |         2 |        2016 |
    |  5 | document  5 |         3 |        2017 |
    |  6 | document  6 |         3 |        2018 |
    |  7 | document  7 |         4 |        2017 |
    |  8 | document  8 |         4 |        2015 |
    |  9 | document  9 |         5 |        2014 |
    | 10 | document 10 |         5 |        2020 |
    +----+-------------+-----------+-------------+
    --------------
    SELECT  a.conteneur
          FROM  documents  AS a
    INNER JOIN  conteneurs AS b
            ON  b.id = a.conteneur
      GROUP BY  a.conteneur
        HAVING  MAX(a.destruction) <= 2017
    --------------
     
    +-----------+
    | conteneur |
    +-----------+
    |         2 |
    |         4 |
    +-----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup Artemus24

    Juste je n'ai jamais utilisé ce genre de syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CONSTRAINT `FK_CONTENEURS` FOREIGN KEY (`conteneur`) REFERENCES `conteneurs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    Pourrais tu me l'expliquer brièvement si ce n'est pas trop demander?

  8. #8
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut klarann.

    Vous avez deux tables, dont l'une est parente (la table "conteneurs') et l'autre enfant (la table "documents").
    Vous créez une clef étrangère entre ces deux tables.
    La déclarative se met, bien sûr, dans la table enfant.

    Cette déclarative signifie que vous reprenez dans la table "documents", la colonne "conteneur", qui est en fait votre clef étrangère (foreign key).
    Vous mettez cette colonne en relation avec une autre colonne de nom "id" qui se trouve dans la table "conteneurs".
    Même si ces deux colonnes ne portent pas le même nom, elles doivent être strictement identiques au niveau de la déclarative du type.

    Et au final, vous précisez deux choses :

    --> ce que vous désirez faire si dans la table parente "conteneurs", vous faites une suppression (delete) sur la colonne "id".
    Le "ON DELETE CASCADE" signifie que vous allez répercuter cette suppression dans la table enfant "conteneurs".

    --> ce que vous désirez faire si dans la table parente "conteneurs", vous faites une mise à jour (update) sur la colonne "id".
    Le "ON UPDATE CASCADE" signifie que vous allez répercuter cette mise à jour dans la table enfant "conteneurs".

    Sinon, vous pouvez lire la documentation sur MySql :
    --> https://dev.mysql.com/doc/refman/5.7...eign-keys.html

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

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut ATTENTION aux contraintes DELETE CASCADE
    L'option DELETE CASCADE est très pratique pour garantir l'intégrité, les filles sont détruites automatiquement lorsque l'occurrence parente, propriétaire de la PK, est elle même détruite.
    Mais, si l'on manipule une ligne d'une table qui possède de nombreuses tables filles en cascade, on risque de provoquer une suppression en masse ce qui va fortement pénaliser les performances de la base de données (nombreux verrous à poser, charge de la log, mise à jour des index...)
    Dans certains cas, on peut arriver à une situation de blocage total de la DB !

    C'est pourquoi, on préfère souvent utiliser l'option ON DELETE SET NULL, puis, en batch le soir, on supprime physiquement les lignes dans les entités filles, dont les FK sont nulles.

Discussions similaires

  1. Problème JOINTURE et CONDITION
    Par nunux34 dans le forum Requêtes
    Réponses: 6
    Dernier message: 13/09/2015, 10h14
  2. Problème jointure (est-elle possible ?)
    Par Ludix_ dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/04/2012, 16h28
  3. Problème de jointure et condition
    Par flagodzki dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/11/2011, 22h34
  4. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27
  5. Réponses: 14
    Dernier message: 17/03/2003, 18h31

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