Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 10/05/2011, 13h33   #1
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Par défaut jointure gauche avec fonction max

Bonjour,
Je souhaite faire une jointure entre 2 tables de manière à récupérer toutes les lignes de la 1ere table et uniquement la ligne de la 2eme table pour laquelle j'ai la valeur max d'un champ.
Voici les données ça sera sans doute plus clair :
Table 1 : programmation
champs : serveur, bdd, frequence

Table 2 : logs
champs : nom_svg, date_svg

Exemples de données :
Code :
1
2
3
4
5
6
7
8
9
10
TABLE programmation:			TABLE logs:
 
serveur	|bdd	|frequence		nom_svg	|date_svg
--------------------------		-----------------
a 	| X 	| 1			A_X 	| 10
a 	| Y 	| 2			A_Y 	| 12
a 	| Z 	| 1			A_Z 	| 15
b 	| S 	| 3			B_S 	| 13
b 	| T 	| 4			B_S 	| 17
b 	| U 	| 2			B_S 	| 16
Voici la requete que j'utilise :
Code :
1
2
3
4
5
6
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, date_svg
FROM programmation AS P 
LEFT OUTER JOIN logs AS L 
ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
GROUP BY CONCAT(Upper(P.serveur),'_',P.bdd), serveur,bdd,frequence
HAVING max (date_svg)
Le problème c'est que pour les cas ou date_svg est null cela ne fonctionne pas et du coup le résultat est :

Code :
1
2
3
4
A_X | a | X | 1 | 10
A_Y | a | Y | 2 | 12
A_Z | a | Z | 1 | 15
B_S | b | S | 3 | 13
ALors que je souhaiterai obtenir :
Code :
1
2
3
4
5
6
A_X | a | X | 1 | 10
A_Y | a | Y | 2 | 12
A_Z | a | Z | 1 | 15
B_S | b | S | 3 | 17
B_T | b | T | 4 | NULL
B_U | b | U | 2 | NULL
Si je retire le 'Having max(date_svg)' j'obtiens toutes les données (donc les données pour lesquelles la valeur de date_svg n'est pas max).

Avez-vous une idée afin d'obtenir le résultat souhaité?
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 14h02   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Voici la requete que j'utilise :
Sérieux cette requête fonctionne sur MySql?
je ne comprends pas ce qu'il peut faire de simplement HAVING max (date_svg), il faudrait une comparaison, (=,<,>, ...).

Pour le besoin, il faut passer par une sous-requête :
Code :
1
2
3
4
5
6
7
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, L.max_dt
  FROM programmation AS P 
  LEFT OUTER JOIN (SELECT nom_svg, max(date_svg) AS max_dt
                     FROM logs
                    GROUP BY nom_svg
                  ) L
               ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 14h55   #3
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Nickel! Merci beaucoup.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h02   #4
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Par défaut Jointure gauche avec max (suite...)

Bonjour,
La requete suivante me permet de faire correctement une jointure gauche en utilisant la fonction max sur un champ de la table de droite:
Code :
1
2
3
4
5
6
7
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, L.max_dt
  FROM programmation AS P 
  LEFT OUTER JOIN (SELECT nom_svg, max(date_svg) AS max_dt
                     FROM logs
                    GROUP BY nom_svg
                  ) L
               ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
Rappel des données d'exemple:
Code :
1
2
3
4
5
6
7
8
9
10
TABLE programmation:			TABLE logs:
 
serveur	|bdd	|frequence		nom_svg	|date_svg |succes
--------------------------		----------------------------
a 	| X 	| 1			A_X 	| 10 	  | oui
a 	| Y 	| 2			A_Y 	| 12 	  | non
a 	| Z 	| 1			A_Z 	| 15 	  | oui
b 	| S 	| 3			B_S 	| 13 	  | non
b 	| T 	| 4			B_S 	| 17 	  | oui
b 	| U 	| 2			B_S 	| 16 	  | non
Le résultat me permet d'obtenir :
Code :
1
2
3
4
5
6
A_X | a | X | 1 | 10
A_Y | a | Y | 2 | 12
A_Z | a | Z | 1 | 15
B_S | b | S | 3 | 17
B_T | b | T | 4 | NULL
B_U | b | U | 2 | NULL
Cependant je souhaiterai récupérer d'autres champs de la table de droite (T2), par exemple le champ succes. Le résultat souhaité dans ce cas serait:
Code :
1
2
3
4
5
6
A_X | a | X | 1 | 10   | oui
A_Y | a | Y | 2 | 12   | non
A_Z | a | Z | 1 | 15   | oui
B_S | b | S | 3 | 17   | oui
B_T | b | T | 4 | NULL | NULL
B_U | b | U | 2 | NULL | NULL
J'ai essayé ça:
Code :
1
2
3
4
5
6
7
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, L.max_dt, L.succes
  FROM programmation AS P 
  LEFT OUTER JOIN (SELECT nom_svg, max(date_svg) AS max_dt, succes
                     FROM logs
                    GROUP BY nom_svg, succes
                  ) L
               ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
Mais bien évidemment il me ressort une ligne pour chaque date max ET succes.
Comment faire svp, je tourne en rond...? Merci d'avance pour votre aide.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 12h38   #5
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
Citation:
Envoyé par nicoaix Voir le message
Bonjour,
J'ai essayé ça:
Code :
1
2
3
4
5
6
7
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, L.max_dt, L.succes
  FROM programmation AS P 
  LEFT OUTER JOIN (SELECT nom_svg, max(date_svg) AS max_dt, succes
                     FROM logs
                    GROUP BY nom_svg, succes
                  ) L
               ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
Mais bien évidemment il me ressort une ligne pour chaque date max ET succes.
Comment faire svp, je tourne en rond...? Merci d'avance pour votre aide.
En fait, tu veux récupérer le champ "succes" de ton max, c'est bien cela ?

Est-ce date_svg est unique dans ta tables logs ?
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h51   #6
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Oui je veux récupérer le champ "succes" du max.

Par contre date_svg n'est pas unique dans la tables logs (mais j'ai un champ 'id_logs' qui est, lui, unique (clé primaire auto incrément) ).
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 16h35   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Il faut rajouter un niveau de sous-requête :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT CONCAT(Upper(P.serveur),'_',P.bdd) AS concatenation, serveur,bdd, frequence, L.max_dt, L.succes
  FROM programmation AS P 
  LEFT OUTER JOIN (SELECT lo.nom_svg, m.max_dt, lo.succes
                     FROM logs lo
                     JOIN (SELECT nom_svg, max(date_svg) AS max_dt
                             FROM logs
                            GROUP BY nom_svg
                          ) m ON lo.nom_svg = m.nom_svg AND lo.date_svg = m.max_dt
                  ) L
               ON CONCAT(Upper(P.serveur),'_',P.bdd)= L.nom_svg
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h18.


 
 
 
 
Partenaires

Hébergement Web