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 18/02/2011, 19h07   #1
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Par défaut Aide conseil pour requete

Bonjour a tous

Voila j'ai deux table TABLE1 et TABLE2

dans la TABLE1 contient 3 champs ID,VALEUR1,DATE1
dans la TABLE2 contient 3 champs ID,VALEUR2,DATE2

je voudrais sortir la chose suivante

ID,DATE1,VALEUR1,DATE2,VALEUR2

ou VALEUR1 est la valeur du max de DATE1 et VALEUR2 la valeur du max de DATE2

J'arrive par l'une des requetes suivantes a sortir les données séparement

Requete 1
Code :
1
2
3
4
5
SELECT a.ID, a.DATE1, a.VALEUR1 
FROM TABLE1 a
JOIN (
SELECT ID, max( DATE1) datemax FROM TABLE1 GROUP BY ID ) b
 ON a.ID= b.ID AND a.DATE1= b.DATE1
Requete 2
Code :
1
2
3
4
5
6
SELECT ID, DATE1, VALEUR1
FROM TABLE1 T
WHERE DATE1 = ( 
SELECT max( DATE1 ) 
FROM TABLE1
WHERE ID = T.ID )
Premiere question laqu'elle des deux requetes est la plus appropriées sachant que les deux donnent le meme temp de réponse chez moi?

Ensuite y a il un moyen réussir a avoir les données des deux tables a la fois?

D'avance merci pour vos conseils réponses
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 21h13   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par sebonsun Voir le message
Premiere question laqu'elle des deux requetes est la plus appropriées sachant que les deux donnent le meme temp de réponse chez moi?
En général, les sous-requêtes corrélées donnent des performances catastrophiques, donc je te conseillerais plutôt la première requête.
Citation:
Ensuite y a il un moyen réussir a avoir les données des deux tables a la fois?
Je t'avoue que je ne comprends rien à ton schéma. Pourrais-tu le présenter avec des noms de colonnes significatifs, quelques données-exemple et un exemple de ce que tu voudrais obtenir ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 09h24   #3
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Bonjour

et merci pour ta réponse

Alors pour imager

La premiere table est une table ou l'on retrouve les relevés de compteurs d'electricités le champ ID est le champ d'un emplacement, le champ DATE et la date du relevé le champ valeur est l'index du compteur

Pour la table 2 pareil mais pour un compteur d'eau.

Ce que je veux c'est ramener sur la meme ligne l'emplacement et ses deux derniers relevés de compteur.

Contenue de la table 1
1 ## 2010-01-01 ## 500
2 ## 2010-01-01 ## 600
4 ## 2010-01-02 ## 700
1 ## 2010-05-01 ## 700

contenue de la table 2
1 ## 2010-01-02 ## 0005
2 ## 2010-02-02 ## 500
6 ## 2010-01-05 ## 600
2 ## 2010-04-08 ## 550

Ce que je veux ramener
1 ## 2010-05-01 ## 700 ## 2010-01-02 ## 0005
2 ## 2010-01-01 ## 600 ## 2010-04-08 ## 550
4 ## 2010-01-02 ## 700 ## null ## null
6 ## Null ## null ## 2010-01-05 600

Voila j'espere que c est unpeu plus clair

D'avance merci pour vos réponse
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 13h46   #4
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Re bon j'avance mais j'aimerais la validation de ce qui suis

Alors pour faire plus simple je vous joints les export des trois tables intérrogées par la requete ci aprés.

Le résultat renvoyé semble cohérent mais le champ id_releve_elec est transformé en décimal ??

Quelque explication avec la requete

Trois table
emplacement,releve_elec et releve_eau

Les tables releve_elec et releve_eau ont la meme structure a savoir
une clef primaire : id_releve_elec et id_releve_eau
Un champ date qui est la date de releve dateelec et dateeau
Un champ indexe qui est l'indexe relevé pour la date
Un champ indexe_old qui est l'indexe du releve précédent
Un champ fact qui me sert a savoir si une facture à était généré pour la ligne en question

La table emplacement me sert a récupérer id_proprietaire associé a id_emplacement.

Et voila la requete enfin je devrais dire la chose....
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
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
 
SELECT test.id_releve_elec, test.id_proprietaire, test.dateelec, test.indexe, test.indexe_old, test.id_emplacement, reau, deau, ieau, oldeau
FROM (
 
SELECT a.id_releve_elec, id_proprietaire, a.dateelec, a.indexe, a.indexe_old, a.id_emplacement
FROM releve_elec a
JOIN (
 
SELECT r.id_emplacement id, max( dateelec ) datemax
FROM releve_elec r
GROUP BY r.id_emplacement
)b ON b.id = a.id_emplacement
AND a.dateelec = b.datemax
NATURAL JOIN emplacement
WHERE fact =0
)test
LEFT JOIN (
 
SELECT re.id_releve_eau reau, id_proprietaire, re.dateeau deau, re.indexe ieau, re.index_old oldeau, re.id_emplacement
FROM releve_eau re
JOIN (
 
SELECT r.id_emplacement id, max( dateeau ) datemax
FROM releve_eau r
GROUP BY r.id_emplacement
)b ON b.id = re.id_emplacement
AND re.dateeau = b.datemax
NATURAL JOIN emplacement
WHERE fact =0
)x ON ( test.id_emplacement = x.id_emplacement ) UNION
 
 
SELECT ielec, test.id_proprietaire,delec,ielec,oldelec,test.id_emplacement,test.id_releve_eau,  test.dateeau, test.indexe, test.index_old
FROM (
 
SELECT a.id_releve_eau, id_proprietaire, a.dateeau, a.indexe, a.index_old, a.id_emplacement
FROM releve_eau a
JOIN (
 
SELECT r.id_emplacement id, max( dateeau ) datemax
FROM releve_eau r
GROUP BY r.id_emplacement
)b ON b.id = a.id_emplacement
AND a.dateeau = b.datemax
NATURAL JOIN emplacement
WHERE fact =0
)test
LEFT JOIN (
 
SELECT re.id_releve_elec relec, id_proprietaire, re.dateelec delec, re.indexe ielec, re.indexe_old oldelec, re.id_emplacement
FROM releve_elec re
JOIN (
 
SELECT r.id_emplacement id, max( dateelec ) datemax
FROM releve_elec r
GROUP BY r.id_emplacement
)b ON b.id = re.id_emplacement
AND re.dateelec = b.datemax
NATURAL JOIN emplacement
WHERE fact =0
)x ON ( test.id_emplacement = x.id_emplacement) WHERE ielec IS NULL
Bon vous avez du vous en appercevoir mais je suis plus qu'amateur en requete sql ( en ortographe aussi ) j'essai de faire un truc pour rendre service a mon beau frere.
Donc pardonnez moi la lourdeur de la requete..... j'essai d'apprendre

Edit:
J'ai oublié le principale le resultat est la liste des proprietaire ou il y a de l'electricité ou de l eau a facturer qui n'a pas encore était facturé (fact =0)


Encore merci d'avance pour votre aide
Fichiers attachés
Type de fichier : sql table.sql (32,0 Ko, 1 affichages)
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 00h31   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Bon, il y a deux hypothèses :
  1. je suppose que l'index relevé ne peut qu'augmenter ; ce cas est plus simple, car l'index maximal est forcément le plus récent, autrement dit le MAX(index) est forcément sur le relevé qui a le MAX(date)
  2. ou alors l'index peut être remis à zéro de temps en temps, auquel cas je dois d'abord chercher le MAX(date), et ensuite l'index correspondant à ce relevé

Commençons par le cas 1. Si je ne prends en compte que l'eau, ça donne :

Code :
1
2
3
4
SELECT E.id_emplacement, MAX(RE.dateeau), MAX(RE.indexe)
FROM emplacement E
  LEFT JOIN releve_eau RE ON E.id_emplacement = RE.id_emplacement
GROUP BY E.id_emplacement
Il est maintenant facile d'ajouter l'électricité avec une seconde jointure externe :

Code :
1
2
3
4
5
6
7
SELECT E.id_emplacement, 
  MAX(RE.dateeau), MAX(RE.indexe),
  MAX(REL.dateelec), MAX(REL.indexe)
FROM emplacement E
  LEFT JOIN releve_eau RE ON E.id_emplacement = RE.id_emplacement
  LEFT JOIN releve_elec REL ON E.id_emplacement = REL.id_emplacement
GROUP BY E.id_emplacement
Dans la seconde hypothèse, je dois chercher la date du dernier relevé de chaque client en utilisant une sous-requête ; l'index que je cherche se trouvera alors sur le relevé du client avec la bonne date.

Code :
1
2
3
4
5
6
7
8
SELECT E.id_emplacement, DRE.dateeau, RE.indexe
FROM emplacement E
  LEFT JOIN (
    SELECT id_emplacement, MAX(dateeau) AS dateeau
	FROM releve_eau
	GROUP BY id_emplacement
	) DRE ON E.id_emplacement = DRE.id_emplacement
  LEFT JOIN releve_eau RE ON DRE.id_emplacement = RE.id_emplacement AND DRE.dateeau = RE.dateeau
En ajoutant l'électricité sur le même modèle, ça donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT E.id_emplacement, 
  DRE.dateeau, RE.indexe,
  DREL.dateelec, REL.indexe
FROM emplacement E
  LEFT JOIN (
    SELECT id_emplacement, MAX(dateeau) AS dateeau
	FROM releve_eau
	GROUP BY id_emplacement
	) DRE ON E.id_emplacement = DRE.id_emplacement
  LEFT JOIN releve_eau RE ON DRE.id_emplacement = RE.id_emplacement AND DRE.dateeau = RE.dateeau
  LEFT JOIN (
    SELECT id_emplacement, MAX(dateelec) AS dateelec
	FROM releve_elec
	GROUP BY id_emplacement
	) DREL ON E.id_emplacement = DREL.id_emplacement
	LEFT JOIN releve_elec REL ON DREL.id_emplacement = REL.id_emplacement AND DREL.dateelec = REL.dateelec
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 01h19   #6
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Merci beaucoup

effectivement la meilleur des solutions et de partir des emplacements.

Ceci evite mon UNION tout pourris je ne sais pas pourquoi je me suis acharné a partir des tables relevé ....


Encore merci a toi
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 01h23   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
En fait, il y avait une bonne intuition, qui est que c'est bizarre de créer deux tables quasiment identiques. Il aurait été plus simple de faire une seule table en ajoutant une colonne type de relevé (eau / électricité).

Mais cela n'aurait rien changé à la requête, sauf qu'à la place de deux tables différentes tu aurais utilisé deux instances de la même table.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 01h28   #8
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Eh ben oui effectivement c'est plus logique vu que j'n fait exactement la meme chose....

Encore merci pour tes conseils
sebonsun 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 +2. Il est actuellement 09h17.


 
 
 
 
Partenaires

Hébergement Web