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 31/08/2011, 20h59   #1
Invité de passage
 
Inscription : août 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 4
Points : 0
Points : 0
Par défaut MYSQL PB pour afficher 10 informations par catégorie

Bonjour,
Je cherche à faire une requête spéciale, elle semble simple pourtant impossible de la faire.
_____________
J'ai une table Client (je passe les détails des colonnes nom prénom etc)
idclient Idrégion
_____________
une table commande
idclient montantcommande
_____________
Je cherche à afficher les 10 meilleurs commandes de chaque région.
Avec une magouille d'algo je peux avoir le résultat mais je cherche à améliorer mon sql.

Autre recherche, afficher la somme des 10 meilleurs commandes par région. Ce qui implique un peu d'avoir trouvé la première requête.

Exemple : cette requête me permet d'avoir la somme de toutes les commandes par région.
Code :
1
2
3
4
5
6
SELECT sum(montantcommande) AS total,*
FROM commande LEFT JOIN client ON commande.Idclient=client.Idclient
LEFT JOIN client ON region.Idregion=client.Idregion
WHERE 1
groupe BY Idregion
ORDER BY montantcommande DESC;
C'est pas mal mais je cherche à avoir la somme de 10 meilleurs commandes et non de toutes les commandes.

Si je rajoute Limit 10 je n'aurais que 10 régions.
Si je change SUM par MAX j'ai la meilleure commande par région.

Voila le gros de mon problème, en espérant avoir été précis sur mon problème
Elisisql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 13h12   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Regarde cette source, ce n'est pas dans la FAQ, mais ça devrait y être.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 16h17   #3
Invité de passage
 
Inscription : août 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 4
Points : 0
Points : 0
Merci, à première vu l'idée est bonne, j'ai juste un problème, c'est que la requête demande trop de ressources, pour afficher 10 régions je me retrouve à attendre un temps fou.

Code :
1
2
3
4
5
6
7
8
9
10
SELECT sum(e.montant_commande) AS nb,c.Id_client, c.Nom_client,  c.Id_region2
FROM commande AS e LEFT JOIN client AS c ON e.Id_client=c.Id_client
WHERE (
SELECT COUNT(*)
FROM commande AS e1 LEFT JOIN client AS c1 ON e1.Id_client=c1.Id_client
WHERE c1.Id_region2 = c.Id_region2
AND c1.Id_client < c.Id_client
) < 10 
ORDER BY nb DESC
LIMIT 20
Sans le SUM, j'arrive à avoir un résultat mais vu que je suis obligé de limiter le nombre, impossible d'exploiter ce genre d'information.


Information complémentaire : je fais des tests sur une très grosse base de données : 200 000 utilisateurs, 300 000 commandes.

L'idée final étant de faire des classements par région, par ville, voire d'autres critères sur le même genre de requête.
Elisisql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h04   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 433
Points : 6 433
Bonjour,

Sous quelle version de MySQL travailles-tu ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h11   #5
Invité de passage
 
Inscription : août 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 4
Points : 0
Points : 0
version 5.1.36
Elisisql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h18   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 433
Points : 6 433
OK. Pas étonnant alors que les performances se dégradent sur une sous-requête corrélée avec une volumétrie un peu forte.
A partir de la version 5.5, les perfs ont commencé à s'améliorer.

Éventuellement, il faut tenter de passer par des tables temporaires pour éliminer les sous-requêtes...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 17h28   #7
Invité de passage
 
Inscription : août 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 4
Points : 0
Points : 0
L'aspect étrange, c'est de pouvoir faire la somme de tous les montants par région sans problème et ensuite lorsque je demande de ne prendre que 10 montants par région il lui faut un temps fou pour l'afficher.
Elisisql est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h55   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Fais un EXPLAIN de la requête et tu devrais constater qu'il y a une lecture complète de table ou de sous-ensemble quelque part.

Citation:
L'aspect étrange, c'est de pouvoir faire la somme de tous les montants par région sans problème
Normal s'il y a un index sur la région.
Citation:
et ensuite lorsque je demande de ne prendre que 10 montants par région il lui faut un temps fou pour l'afficher.
Normal aussi car les montants sont calculés mais non indexés donc parcours total pour obtenir le résultat.

En mettant le premier calcul dans une table temporaire et en indexant cette table, il y a des chances pour que ça aille beaucoup plus vite.

Bon courage.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 15h40   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
L'utilisation de jointures externes est elle necessaire ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 15h48   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Yanika_bzh Voir le message
L'utilisation de jointures externes est elle necessaire ?
C'est vrai que des commandes rattachées à aucun client seraient bizarres !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil 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 21h50.


 
 
 
 
Partenaires

Hébergement Web