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 :

PROBLEME DE LEFT OUTER JOIN


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut PROBLEME DE LEFT OUTER JOIN
    Bonjour à tous,

    J'ai un problème de requête un peu complexe sur plusieurs tables.
    Je m'explique :
    J'ai les tables suivantes :

    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    -- Structure de la table `contacts`
    -- 
     
    CREATE TABLE `contacts` (
      `id` int(11) NOT NULL auto_increment,
      `type` int(11) default NULL,
      `demarche` int(11) default NULL,
      `societe` int(11) NOT NULL default '0',
      `provenance` int(11) NOT NULL default '0',
      `civilite` longtext,
      `nom` longtext,
      `prenom` longtext,
      `adresse` longtext,
      `cp` longtext,
      `ville` longtext,
      `tel` longtext,
      `mobile` longtext,
      `fax` longtext,
      `mail` longtext,
      `budget_max` longtext,
      `zone_geo` int(11) default NULL,
      `observation` longtext,
      `date` date default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=318 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `lots`
    -- 
     
    CREATE TABLE `lots` (
      `id` int(11) NOT NULL auto_increment,
      `id_prog` int(11) default NULL,
      `numero` tinyint(4) default NULL,
      `surface_nue` int(11) default NULL,
      `surface_batie` int(11) default NULL,
      `shon` int(11) default NULL,
      `prix` int(11) default NULL,
      `etat` varchar(50) default 'Libre',
      `surface_nc` int(11) default NULL,
      PRIMARY KEY  (`id`),
      KEY `id_prog` (`id_prog`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=139 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `programme`
    -- 
     
    CREATE TABLE `programme` (
      `id` int(11) NOT NULL auto_increment,
      `nom_programme` varchar(50) default NULL,
      `dpt` varchar(50) default NULL,
      `ville` varchar(50) default NULL,
      `date_livraison` date default NULL,
      `eau` tinyint(1) default NULL,
      `egout` tinyint(1) NOT NULL default '0',
      `edf` tinyint(1) default NULL,
      `gaz` tinyint(1) default NULL,
      `brl` tinyint(1) default NULL,
      `telecom` tinyint(1) default NULL,
      `tre` tinyint(1) default NULL,
      `tre_montant` int(11) default NULL,
      `tle` tinyint(1) default NULL,
      `tdcaue` tinyint(1) default NULL,
      `tdens` tinyint(1) default NULL,
      `archi_coord` int(11) default NULL,
      `geometre` int(11) default NULL,
      `lien` varchar(150) default NULL,
      `caution` int(11) default NULL,
      `contact` longtext,
      `mentions_legales` longtext,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `provenance`
    -- 
     
    CREATE TABLE `provenance` (
      `id` int(11) NOT NULL auto_increment,
      `nom_provenance` varchar(50) NOT NULL default 'NA',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `ventes`
    -- 
     
    CREATE TABLE `ventes` (
      `id` int(11) NOT NULL auto_increment,
      `id_contact` int(11) default NULL,
      `id_lot` int(11) default NULL,
      `type_vente` longtext,
      `id_precripteur` int(11) NOT NULL default '0',
      `financement` varchar(50) default NULL,
      `id_banque` int(11) default NULL,
      `accord_pret` varchar(50) default NULL,
      `date_credit` date default NULL,
      `date_compromis` date default NULL,
      `date_acte` date default NULL,
      `cheque_encaisse` varchar(50) default NULL,
      `notification` date default NULL,
      `notification_notaire` date default NULL,
      `retour_ar` date default NULL,
      `retour_ar_notaire` date default NULL,
      `autre_notification` date default NULL,
      `detail_autre_notification` longtext,
      `montant_cheque` int(11) default NULL,
      `date_cheque_resa` date default NULL,
      `numero_cheque_resa` varchar(50) default NULL,
      `prix_vente` int(11) default NULL,
      `observations` longtext,
      `echeance_vente` date default NULL,
      `montant_comission` double default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ;
    Je cherche à faire un requête qui me retourne tous les LOTS d'un PROGRAMME voulu, qu'il soit référencé dans la table VENTE ou pas, en y attachant également des infos prises dans les table CONTACTS et PROVENANCE.

    J'ai utilisé LEFT OUTER JOIN : cela ne fonctionne que si je selectionne uniquement les tables LOTS, VENTES, et PROGRAMME. Si j'ajoute les tables CONTACTS et PROVENANCES, je n'obtient que les LOTS référencés dans la table VENTE.

    Voici ma requête :

    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
     
    SELECT
    lots.numero AS Numero,
    lots.prix AS 'Prix grille',
    ventes.prix_vente AS 'Prix de reservation',
    CONCAT_WS( ' - ', contacts.nom, contacts.prenom ) AS Acquereur,
    provenance.nom_provenance AS 'Origine du contact',
    ventes.date_compromis AS 'Date promesse',
    ventes.echeance_vente AS 'Echeance promesse',
    ventes.date_acte AS 'Date acte',
    ventes.montant_comission AS 'Commission (HT)',
    CONCAT_WS( ' ', contacts_1.nom, contacts_1.prenom ) AS Vendeur
     
    FROM
    programme,
    lots LEFT OUTER JOIN ventes ON lots.id=ventes.id_lot,
    contacts,
    contacts AS contacts_1,
    provenance
     
    WHERE
    programme.id = lots.id_prog
    AND contacts.id = ventes.id_contact
    AND contacts_1.id = ventes.id_precripteur
    AND provenance.id = contacts.provenance
    AND programme.nom_programme = 'LES LAURIERS'
    ORDER BY Numero ASC
    Je dois dire que je n'y comprend plus rien.

    Help!

    D'avance merci.

  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,

    Ton problème vient du fait que tu mélanges les 2 types d'écritures de jointures (version SQL1 en séparant les tables par des virgules et version SQL2 avec LEFT JOIN). Du coup, tu fais également des jointures internes, ce qui limite le nombre de lignes dans ton résultat.
    Il vaut mieux n'utiliser que la seconde forme (INNER JOIN et OUTER JOIN), et notamment des jointures externes.
    Voir la FAQ sur ce sujet .

    ced
    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
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour cette précision.
    Cela dit, j'avais déjà essayé de n'utiliser que les jointure de type JOIN, mais j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1066 - Not unique table/alias: 'ventes'
    Je ne comprend pas comment lier une table à plusieurs autres tables (comme avec les WHERE...=...) sans faire d'aliases.

    Merci

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bon, après recherche, j'ai enfin compris :

    Il ne faut pas répéter le nom de la table chaque fois qu'on utilise JOIN...

    Donc cette fois ci, ça marche.

    Merci encore

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

Discussions similaires

  1. [AC-2003] Probleme jointure left outer join
    Par Ardiden31 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/04/2012, 08h47
  2. [AC-2003] Probleme avec LEFT OUTER JOIN
    Par Ardiden31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/04/2012, 22h00
  3. [probleme]left outer join
    Par BALLO1710 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/04/2010, 13h56
  4. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08

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