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/2011, 09h59   #1
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Par défaut Optimisation d'une requête SQL

Bonjour tout le monde,

J'aurais besoin de vos précieux conseils pour optimiser une requête que j'ai fait mais qui est bien trop lourde.

Voici ma requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT E.nom_entreprise,E.id_entreprise,A.dt_avis
FROM Entreprises E
JOIN Avis A
USING ( id_entreprise ) 
JOIN (
	SELECT A.id_entreprise,MAX( A.dt_avis ) AS dt_avis
	FROM Avis A
	group by A.id_entreprise
	ORDER BY dt_avis DESC
)t
USING ( id_entreprise, dt_avis ) 
WHERE E.ville_entreprise =  'paris'
AND E.cp_entreprise =  '75015'
GROUP BY E.id_entreprise
ORDER BY dt_avis DESC 
LIMIT 0 , 30
Voici l'explication de la SQL :
J'ai deux tables. Entreprises et Avis
La première table, j'ai dedans id_entreprise, nom_entreprise, ville_entreprise
La seconde table, j'ai dedans id_avis, id_entreprise, dt_avis (date de l'avis)

Le but de la requête, c'est d'afficher les avis les plus récent (dt_avis desc) selon la ville dans Entreprises en groupant les id_entreprise de Entreprises identiques.

Merci de votre aide !!!
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 13h41   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Salut

En faisant comme ceci :
Code sql :
1
2
3
4
5
6
7
8
 
SELECT E.nom_entreprise,E.id_entreprise,A.dt_avis
FROM Entreprises E
JOIN Avis A ON E.id_entreprise = A.id_entreprise
WHERE E.ville_entreprise =  'paris'
AND E.cp_entreprise =  '75015'
ORDER BY dt_avis DESC 
LIMIT 0, 30
En faite, comme ça je ne perçois pas l'utilité de la sous-requête et même du GROUP BY.
Est-ce volontaire ?


Théoriquement, en faisant une jointure naturelle telle que JOIN, ça devrait grouper les id_entreprises de manière naturelle.
Il resterait donc juste à faire un trie.
J'ai peut être pas tout compris ceci dit.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 13h43   #3
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Yes, pas mal, reste plus qu'à grouper les E.id_entreprise

Merci
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 14h19   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
Yes, pas mal, reste plus qu'à grouper les E.id_entreprise
Comment ça grouper le E.id_entreprise ?

En rajoutant un GROUP BY E.id_entreprise, ça donne quoi ?


Ce ne serait pas un tri sur E.id_entreprise et dt_avis que tu souhaiterais par hasard ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 14h29   #5
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Pourtant j'ai bien plusieurs fois le meme id_entreprise qui ressort
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 14h44   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
Pourtant j'ai bien plusieurs fois le meme id_entreprise qui ressort
Oui, je viens de me rencontre que j'ai dis une bêtise.

La requête d'ailleurs me semblerais plus logique comme ceci :
Code :
1
2
3
4
5
6
7
8
 
SELECT E.nom_entreprise,E.id_entreprise,A.dt_avis
FROM Avis A
JOIN Entreprises E ON A.id_entreprise = E.id_entreprise
WHERE E.ville_entreprise =  'paris'
AND E.cp_entreprise =  '75015'
ORDER BY dt_avis DESC 
LIMIT 0, 30
Théoriquement ça ne devrait rien changer, c'est juste qu'on perçois mieux que le but 1er est de rechercher des avis, (donc table Avis) qui elle est liée aux entreprises.

On obiendra bien une liste d'avis, donc potentiellement plusieurs id_entreprises s'il y a plusieurs avis pour 1 entreprise.


Mais j'ai corrigé mon post plus entre temps, et la question que je me pose serait s'il te faut la liste de tous les avis ou pas ?

- S'il te faut cette liste des avis, qu'il y ait 1 seul ou plusieurs par entreprise, il ne sera pas possible de faire un regroupement, dans ce cas là il vaut mieux le faire en Php.
C'est bien souvent un soucis de présentation.
Sinon il faut faire ça en 2 requêtes imbriquées. Une 1ère qui récupère les entreprises, une 2ème imbriquée pour rechercher les différents avis.

- S'il te faut juste par exemple 1 seul avis par entreprise, ou par exemple le nombre d'avis par entreprise, là un regroupent sera possible.


Si tu fais un regroupement sur les entreprise, on obtiendra justement qu'une seule entreprise, et du coup aussi 1 seul avis, et c'est théoriquement le 1er qui sera récupéré.


Sinon, la question que je posais dernièrement c'est si ce n'était pas un tri sur E.id_entreprise et dt_avis que tu souhaiterais.


Tout ce ci sauf erreur.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 15h22   #7
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Merci pour ton implication et ton travail sur mon sujet !!


bon WE
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU 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 22h41.


 
 
 
 
Partenaires

Hébergement Web