Requête introuvable ...

Signaler
Messages postés
31
Date d'inscription
jeudi 3 décembre 2009
Statut
Membre
Dernière intervention
12 février 2012
-
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
-
Chers amis développeurs, bonjour,

Je vous écris car je travaille actuellement sur un site pour un projet et j'avoue que je ne trouve pas une requête.
Pour faire simple, j'ai deux tables, une table jouet et une table commande. J'aimerais afficher le prix et nom du jouet le plus vendu (dont l'id_jouet est le plus souvent de fois dans la table commande).
Et je ne trouve pas la requête.
Je patine avec cette base :
SELECT id_jouet, nom, prix, count(id_jouet) nb FROM jouet WHERE id_jouet IN (SELECT id_jouet FROM commande) GROUP BY nom, prix HAVING nb = (SELECT max(count(id_jouet)) FROM commande)
Mais ça ne fonctionne pas pourtant, et je me casse vraiment les dents là dessus.
Pour faire simple, ma table jouet à les champs id_jouet, nom, prix et la table commande id_jouet.
Quelqu'un peut me venir en aide, j'en peux plus là ;..
Merci d'avance


 

3 réponses

Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
Alors pour ma part je ferai de la façon suivante:
SELECT id_jouet, count(*) as nb FROM commande GROUP BY id_jouet order by nb desc limit 0,1.
Et à partir de là, je fais une seconde requete pour trouver le nom etc..
Et puis un autre conseil (retour d'expérience) séparer l'objet de son prix. L'objet n'évolue pas son prix oui !!
S.
Messages postés
31
Date d'inscription
jeudi 3 décembre 2009
Statut
Membre
Dernière intervention
12 février 2012
2
C'est effectivemnet une solution à laquelle je n'avais pas pensé. Pour le prix, on a fait de simple script de mise à jour en admin pour que l'utilisateur sélectionne le nom du jouet dans une liste déroulante, ça retourne l'ID, ouvre la page d'édition et mets à jour les changements en fonction de l'ID.

Mais merci quand même :)


 
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Une autre possibilité consiste à utiliser des méta-données. L'idée est de stocker dans la table jouets, pour chaque jouet, le nombre de fois qu'il a été commandé. A chaque commande, une petite requête qui incrémente le compteur de 1.
L'idée est qu'il y a beaucoup moins de commandes que d'affichages de pages. Donc exécuter cette requête supplémentaire quand une commande est validée est moins gourmand en ressources qu'une jointure ou deux requêtes.
Pour afficher le jouet le plus vendu :
SELECT * FROM jouet WHERE jouet_nb_commandes = MAX(jouet_nb_commandes);


Non testé, mais à vue de nez, ça doit donner quelque chose d'intéressant.
Il convient bien entendu de placer un index sur la colonne fraîchement créée.

Une autre option, que j'ai écartée pour plusieurs raisons, aurait été :
SELECT * FROM jouet ORDER BY jouet_nb_commandes DESC LIMIT 1;

Solution écartée car je pense qu'ordonner toute la table est plus lent que de ne prendre qu'une seule ligne (surtout avec l'index sur jouet_nb_commandes). Par ailleurs, la clause LIMIT est propre à MySQL et pas du tout conforme au standard.

Cette solution de "méta-donnée" (il s'agit d'une donnée calculée stockée, par opposition aux données calculées d'après des données stockées) est très courante et permet de sérieux gains de perfs (et facilitent aussi les requêtes par la même occasion).
Bon, j'ai pas forcément utilisé un langage de DBA, mais j'ai fait de mon mieux pour être compris ^^

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)