Pb requete mysql

Messages postés
312
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
14 septembre 2004
- - Dernière réponse : Tomcube
Messages postés
312
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
14 septembre 2004
- 5 sept. 2004 à 14:40
Salut à tous,

J'ai un problème pour créer une requête mysql.

J'ai une table "vente" avec des champs "id_vente, id_vendeur, id_objet, prix, qtt". Là dedans, je mets toutes les propositions de vente des clients.

Le but est de faire une page d'achat pour les acheteurs avec l'affichage des trois plus petits prix et de la quantité disponible pour chaque prix. Et ce, pour une trentaine d'objets sur la même page.

Le problème, c'est que j'ai pas envie de faire 200 requêtes pour réaliser cette page. Pouvez-vous m'aider à me monter une requete condensée pour avoir tout ça en un coup. ?

-------------------------------
Life is a game, Enjoy ! ^^
Afficher la suite 

6 réponses

Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
0
Merci
A mon avis tu vas devoir faire 2 requetes.

Il faut une variable $page qui est le muméro de la page (page1=0, page2=1,...) et tu fait $page=$page*30; pour savoir a partir de quel article tu doit afficher. Ensuite tu sélectionne la liste des articles à afficher avec :


SELECT DISTINCT(id_objet) as id FROM vente LIMIT $page,30;



Ensuite tu fait une boucle, dans la boucle tu lit le nom de l'objet (que tu met par exemple dans $objet) et tu fait


SELECT * FROM vente WHERE id_objet=$objet ORDER BY prix LIMIT 0,3



Cette requète renverra les 3 plus bas prix pour l'objet en cours.

?-) Grrrrrrrrrrr ?-)
Commenter la réponse de gibozsec
Messages postés
312
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
14 septembre 2004
1
0
Merci
Merci de ta réponse

Je suis d'accord, mais si je fais une boucle pour chacun des 30 produits, ça revient au même, je fais donc 31 requêtes, c'est ça le problème. Je me demandais s'il était possible de réaliser ça avec un minimum de requête. Parce que je vois mal le serveur SQL tenir avec 3000 requêtes la minute ...

-------------------------------
Life is a game, Enjoy ! ^^
Commenter la réponse de Tomcube
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006
0
Merci
Si on part du principe que les memes produits ont le meme id_objet si ce n'est pas le cas corrige ce détail...) et si tu ne veux qu'une seule requete SQL, tu peux faire:
SELECT * FROM vente ORDER BY id_objet,prix

tu auras tous tes produits à vendre classés par id_objet puis par prix...

Que la Force soit avec toi, Jeune Padawan!!!
Commenter la réponse de cs_windu
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
0
Merci
Ok, j'avais pas compris je croyait que tu voulais limiter le nombre de requètes à écrire pas à exécuter.

Une autre solution serait de faire une requète du genre

SELECT MIN(prix) as prixMini, id_vente, qtt FROM vente GROUP BY id_ojet LIMIT $page,30;

Le problème c'est que tu n'y afficherais que l'objet le moins chère et pas les 3 moins chère. La fonction MIN permet peut etre de renvoyer 3 résultats essaye de te renseigner, si c'est la cas tu le fera en 1 requete.

?-) Grrrrrrrrrrr ?-)
Commenter la réponse de gibozsec
Messages postés
312
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
14 septembre 2004
1
0
Merci
Merci de vos réponses !

> Windu, ta requête a le mérite d'être courte et simple, mais si il y a 10000 ordres de vente par les clients, pour trier les ordres entre ceux qui correspondent aux trois plus bas prix et les autres, ça doit faire ramer le serveur à mort à chaque chargement de la page.

> gilbozec, la dernière requête que tu as mis est une solution pour avoir le plus bas des prix. c'est la solution par laquelle j'avais commencé à réfléchir. le problème c'est que ça ne donne pas le deuxième plus bas, ni le 3e ...

Je recherche bien le système qui permet de réduire le temps d'exécution et qui sollicite le moins possible le serveur. si c'est long à écrire ça me dérange pas. Si ça me permet de réduire le nombre de requête de 30 à 5 ça me va déjà !

peux-on faire quelque chose au niveau des sous-requêtes qu'on pourrait mettre ? sinon, je serai obliger de me restreindre à n'afficher que le plus bas des prix, et ensuite de faire cliquer l'acheteur sur un des produits pour afficher les différents prix de ce produit ...

-------------------------------
Life is a game, Enjoy ! ^^
Commenter la réponse de Tomcube
Messages postés
312
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
14 septembre 2004
1
0
Merci
J'ai la requête permettant d'obtenir les 2 premiers prix. Il faut en fait utiliser 2 fois la même table et d'utiliser HAVING COUNT(DISTINCT prix) <= 2. Par contre, je ne sais pas comment faire pour avoir le nombre de quantité dispo pour ces deux premiers prix.

-------------------------------
Life is a game, Enjoy ! ^^
Commenter la réponse de Tomcube