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

PHP & Base de données Discussion :

Jointure entre 3 tables [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut Jointure entre 3 tables
    Bonjour,

    Je fais appel à votre aide concernant une jointure entre 3 tables, je souhaite que ma requete fasse apparaitre tous ses enregistrements de la table de gauche (heure) meme les enregistrement qui ne trouve pas de correspondance dans l'autre table.
    J'ai donc opté pour un LEFT JOIN mais ma requete ne fais pas apparaitre l'ensemble des enregistrement de ma table de gauche (heure) et je ne comprend pas pourquoi.
    J'espère avoir été assez clair.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT c.co_date, COUNT( c.co_order ) AS qte, c.co_service, c.co_zone, c.co_dispatcheur, c.co_preparateur, c.co_cle, r.re_date, substr( c.co_date, 12, 4 ) AS Time_10min, h.he_10min, TIMEDIFF( r.re_date, c.co_date ) AS diff
    FROM heure AS h
    LEFT JOIN commande AS c ON h.he_10min = substr( c.co_date, 12, 4 ) 
    LEFT JOIN retour AS r ON c.co_cle = r.re_cle
    WHERE c.co_jour = '2010-03-18'
    GROUP BY h.he_id
    ORDER BY c.co_id DESC

  2. #2
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Lorsque tu fais un left join, si la jointure ne peut se faire, alors les champàs prennent la valeur NULL.
    Or dans ton where tu teste sur 2010-03-18. Si tu veux aussi les résultats qui ne matchent pas alors il te faut faire un test IS NULL

    Essaye ceci:
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c.co_date, COUNT( c.co_order ) AS qte, c.co_service, c.co_zone, c.co_dispatcheur, c.co_preparateur, c.co_cle, r.re_date, substr( c.co_date, 12, 4 ) AS Time_10min, h.he_10min, TIMEDIFF( r.re_date, c.co_date ) AS diff
    FROM heure AS h
    LEFT JOIN commande AS c ON h.he_10min = substr( c.co_date, 12, 4 ) 
    LEFT JOIN retour AS r ON c.co_cle = r.re_cle
    WHERE c.co_jour IS NULL OR c.co_jour = '2010-03-18'
    GROUP BY h.he_id
    ORDER BY c.co_id DESC

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Cela ne change rien au resultat de ma requete car la jointure n'est pas sur le c.co_jour.
    Je souhaite voir apparaitre la totalité de la table gauche soit 144 enregistrements et afficher les elements de la table de droite qui correspondent.
    Pour info la jointure se fait sur une découpe du timestamp jusqu'au minute (exemple : 12:1, 13:4, 15:5) et ma table de gauche comporte dans la colonne he_10min toute les heures de la journée par 10 minutes (ex: 11:0 , 11:1 , 11:2 , 11:3 etc.

    Et donc ma requete de base qui est toute simple c'est afficher les enregistrement découpés de ma table droite (co_date)

    J'ai également testé avec une requete simplifié et le résultat n'affiche que les heures qui match...

    Voia ce que je souhaite obetnir :

    co_date.................qte....... Time_10min........... he_10min.....diff
    ........................................22:00
    ........................................21:05
    ........................................ 21:04
    18/03/2010 21:33.... 1......... 21:03....................21:03.........00:03:47
    18/03/2010 21:28.....2......... 21:02....................21:02.........00:04:48
    ........................................21:01
    ........................................ 21:00
    ........................................ 20:05
    18/03/2010 20:42.....8..........20:04...................20:04.........00:05:56
    18/03/2010 20:34.....8..........20:03...................20:03.........00:52:44

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par Budy123 Voir le message
    Cela ne change rien au resultat de ma requete car la jointure n'est pas sur le c.co_jour.
    ça ne change rien au résultat... tu as testé ? Quel est le rapport avec la jointure sur co_jour ?

    J'ai fait un petit test, j'ai simulé tes tables de façon très simplifié:
    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
    mysql> select * from h;
    +----+-----+
    | id | min |
    +----+-----+
    |  1 | 10  |
    |  2 | 20  |
    |  3 | 30  |
    |  4 | 40  |
    +----+-----+
    4 rows in set (0.00 sec)
     
    mysql> select * from c;
    +-----+------+------+
    | cle | date | jour |
    +-----+------+------+
    |   1 | 30   | 4    |
    |   2 | 30   | 5    |
    +-----+------+------+
    2 rows in set (0.01 sec)
     
    mysql> select * from r
        -> ;
    +-----+------+
    | cle | date |
    +-----+------+
    |   1 | 80   |
    +-----+------+
    1 row in set (0.00 sec)
    Avec un peu d'imagination on peut faire un certain parallèle avec tes tables...

    Maintenant j'execute ta requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mysql> SELECT c.*, h.*, r.*
        -> FROM h
        ->    LEFT JOIN c on(c.date = h.min)
        ->    LEFT JOIN r on (c.cle = r.cle)
        -> WHERE c.jour = 4;
    +------+------+------+----+-----+------+------+
    | cle  | date | jour | id | min | cle  | date |
    +------+------+------+----+-----+------+------+
    |    1 | 30   | 4    |  3 | 30  |    1 | 80   |
    +------+------+------+----+-----+------+------+
    1 row in set (0.01 sec)
    Je rajoute le test IS NULL:
    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
     
    mysql> SELECT c.*, h.*, r.*
        -> FROM h
        ->    LEFT JOIN c on(c.date = h.min)
        ->    LEFT JOIN r on (c.cle = r.cle)
        -> WHERE c.jour = 4
        ->    OR c.jour IS NULL;
    +------+------+------+----+-----+------+------+
    | cle  | date | jour | id | min | cle  | date |
    +------+------+------+----+-----+------+------+
    | NULL | NULL | NULL |  1 | 10  | NULL | NULL |
    | NULL | NULL | NULL |  2 | 20  | NULL | NULL |
    |    1 | 30   | 4    |  3 | 30  |    1 | 80   |
    | NULL | NULL | NULL |  4 | 40  | NULL | NULL |
    +------+------+------+----+-----+------+------+
    4 rows in set (0.00 sec)
    Est-ce que ça correspond à ce que tu attends ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    Bonsoir M. N,

    Un grand merci c'est exactement le résultat que je souhaitais, j'ai juste un légé soucis, ma requete comprends un COUNT qeu le system digère mal visiblement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT c.co_date, COUNT( c.co_order ) AS qte, c.co_service, c.co_zone, c.co_dispatcheur, c.co_preparateur, c.co_cle, r.re_date, substr( c.co_date, 12, 4 ) AS Time_10min, h.he_10min, TIMEDIFF( r.re_date, c.co_date ) AS diff
    FROM heure AS h
    LEFT JOIN commande AS c ON ( substr( c.co_date, 12, 4 ) = h.he_10min ) 
    LEFT JOIN retour AS r ON ( c.co_cle = r.re_cle ) 
    WHERE c.co_jour = '2010-03-18'
    OR c.co_jour IS NULL
    Voici le message d'erreur affiché par la base :

    MySQL a répondu:

    #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Par défaut
    J'ai trouvé la réponse, désolé j'avais mal lu le message d'erreur (pour ne pas dire pas lu !!!!)
    J'ai ajouté un GROUP BY et le tour est joué..
    Encore merci.

    J'auras une questions moin technique, comment affiches tu des exemples de résultats et/ou tabe comme tu fais dans tes réponses?

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

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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