Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 19/03/2010, 22h12   #1
Nouveau Membre du Club
 
Homme
Inscription : décembre 2009
Messages : 139
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2009
Messages : 139
Points : 28
Points : 28
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 :
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
Budy123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 23h42   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 836
Points : 5 836
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 :
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
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2010, 11h51   #3
Nouveau Membre du Club
 
Homme
Inscription : décembre 2009
Messages : 139
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2009
Messages : 139
Points : 28
Points : 28
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
Budy123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2010, 23h40   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 836
Points : 5 836
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 :
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 :
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 :
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 ?
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2010, 00h29   #5
Nouveau Membre du Club
 
Homme
Inscription : décembre 2009
Messages : 139
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2009
Messages : 139
Points : 28
Points : 28
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 :
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
Budy123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2010, 00h34   #6
Nouveau Membre du Club
 
Homme
Inscription : décembre 2009
Messages : 139
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2009
Messages : 139
Points : 28
Points : 28
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?
Budy123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 05h13.


 
 
 
 
Partenaires

Hébergement Web