[MYSQL] Notion de "le plus proche"

Fermé
otherwise01 - 5 août 2008 à 15:32
Kcazer Messages postés 26 Date d'inscription lundi 5 mai 2008 Statut Membre Dernière intervention 13 août 2008 - 7 août 2008 à 15:13
Bonjour à tous,

Ce que je souhaite faire, c'est affiner au maximum une requête:

Il y a deux catégories de personnes sur mon site:

- Les particuliers
- Les entreprises

Lors de l'inscription, les particuliers entrent un prix min et max dans mon formulaire, les entreprises également.

Ce que je souhaite c'est sélectionner l'entreprise dont le prix est le plus proche de celui du particulier. C'est là tout mon problème. Existe-il une fonction qui le permette ?

Merci

12 réponses

X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
5 août 2008 à 15:39
Moi je te conseillerais un truc pour faire ça en php.

Tu peux faire la différence entre le prix x et le prix y (tu fais une valeur absolue autour de celui-ci pour qu'il ne soit pas négatif) et tu compares ensuite. Si c'est le plus petit montant pour l'instant, alors tu gardes celui là sinon tu passes au prix suivant et cela jusqu'à que tu aies fait toute la table de prix. ;)

Si tu donnes l'allure de tes tables (champ, etc) et ce que tu veux comparer, je peux te montrer ce que je propose (en php/mysql).
0
Merci c cool.

Tout se passe dans jos_comprofiler (site joomla avec community builder)

Voici ma requête (après je remplacerais les valeurs par mes variables, c'est juste pour le teste)

SELECT id FROM jos_comprofiler
WHERE apc_type = 'Entreprises / Associations'
AND cb_servicesquevousproposez = 'Soutien scolaire'
AND cb_choixdesdepartements = '06'


et là comme je te disais, je veux aussi ajouter un truc du genre

AND Leprixdeluser (donc par exemple la moyenne entre prix min et prix max on va dire 120 par exemple. Ca se sera une variable) est le plus proche du prix que propose l'entreprise


Nom des 4 colonnes que j'utilise:
cb_prixminuser
cb_prixmaxuser
cb_prixminentreprises
cb_prixmaxentreprises
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
5 août 2008 à 16:10
Ok mais c'est une requête incluse dans une page php?
0
Bah oui. C'est vrai que j'ai oublié de le préciser.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
5 août 2008 à 16:22
Dernière question: tu veux prendre le (prixminuser + prixmaxuser) / 2 (donc faire la moyenne du prix). Tu le compares à quoi? à (prixminentreprise + prixmaxentreprise) / 2 ??? (moyenne du prix de l'entreprise)

0
Ma réponse va te paraître bizarre mais je sais pas justement ! lol
A ce qui est logique si on avait à choisir l'entreprise manuellement.

Par exemple, le particulier dit:
Je mets entre 120 et 150 euros dans du soutien scolaire.


Là, 2 entreprises de sa localité... sont répertoriés.
Entreprise1 dont les prix sont: Entre 100 et 150
Entreprise2 dont les prix sont: Entre 100 et 110

Si j'avais à choisir "manuellement", j'enverrais le client vers la deuxième entreprise. (probablement plus avantageux pour lui)
Mais si on fait la moyenne, :
Entreprise1 : 100+150/2 = 125
Entreprise2 : 100+110/2 = 105
Particulier: 120+150/2 = 135
Donc si on choisit la moyenne, ça enverra le particulier vers l'entreprise1 et c'est pas bon...
0
Ou alors:

Le prixminuser qui est le plus proche du prixmaxentreprise... ?
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
5 août 2008 à 16:51
Un client est prêt à payer moins mais pas plus généralement quand il indique un prix. Donc il serait logique de ne garder que les prix qui sont plus petit ou égal au prixmaxclient. Et ensuite tu choisi le plus petit prix possible. Je pense que c'est la meilleure façon de procéder.
0
Après réfleion, ça suffit pas.

Je reprends:


Par exemple, un client dit (en remplissant un formulaire):
Je mets entre 120 et 150 euros dans du soutien scolaire dans le 06.


Je souhaite trouver les 3 entreprises les plus appropriées:
SELECT...
WHERE apc_type = 'Entreprises / Associations'
AND cb_servicesquevousproposez = 'Soutien scolaire'
AND cb_choixdesdepartements = '06'
AND '150' >= cb_prixminentreprises ;
ORDER BY cb_prixmaxentreprises
LIMIT 0, 3


Ce qui signifie:

Sélection des 3 entreprises qui ont le prixmax le moins élevé
Qui proposent le service souhaité (ici Soutien scolaire)
Dans le département souhaité (ici 06)
Où 150 Euros (prix maximum que peut mettre le particulier) est > ou = au prixminentreprises

Mais si il n'y a moins de 3 entreprises trouvées avec ses critères, il faut sélectionner les entreprises (où tampis la clause "150 Euros (prix maximum que peut mettre le particulier) est > ou = au prixminentreprises" ne sera pas validée) mais qui seront quand même les plus avantageuses pour le client...

Là est mon problème...
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
6 août 2008 à 15:54
Tu fais pas ta vérification comme ça.

SELECT id FROM jos_comprofiler
WHERE apc_type = 'Entreprises / Associations'
AND cb_servicesquevousproposez = 'Soutien scolaire'
AND cb_choixdesdepartements = '06'
AND cb_prixmaxentreprises <=cb_prixmaxuser
ORDER BY cb_prixmaxentreprises
LIMIT 0, 3

Comme ça, tu auras toujours des entreprises ayant leur prix max plus petit ou égal au prix max du client. Mais là, si tu as 5 entreprises avec des bons prix, il se pourrait que tu n'aies pas les 3 entreprises qui sont les meilleurs encore. Il faudrait pousser plus loin les calculs avec un "having" pour calculer que le prix max de l'entreprise soit le plus proche possible de celui du prix min du client (ce serait une façon efficace de faire.

EDIT ou bien même pas, tu utilises cette requête sans aucun top 3 et tu l'utililses comme sous requête d'une autre. :o
Je sais pas, pleins de façons de faire, ça dépend du résultat désiré.
0
Re,

J'avais pensé sinon à incrémeter de 10euros jusqu'à ce qu'il y ait 3 entreprises correspond

Ex: Prix user: Entre 120 et 150

Donc:

WHERE...
AND '150' <= cb_prixminuser

Si aucun résultat alors ça devient

WHERE...
AND '160' <= cb_prixminuser


etc...


Quand tu parlais du HAVING, c'est à dire ? Je peux faire comment ?
Sinon, tu parlais aussi d'une sous-requête; ça je peux pas parce que j'utilise MySQL v.4.0 et les requêtes imbriquées ne sont pas autorisées.
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 19
6 août 2008 à 18:20
Ben il doit y avoir un moyen de prendre les 3 entreprises les plus proches et les moins cher. Cependant, si tu tiens à lui proposer quand même les entreprises plus hautes que son budget, alors pourquoi te casser la tête.

SELECT id FROM jos_comprofiler
WHERE apc_type = 'Entreprises / Associations'
AND cb_servicesquevousproposez = 'Soutien scolaire'
AND cb_choixdesdepartements = '06'
ORDER BY cb_prixmaxentreprises
LIMIT 0, 3

Et il te file les trois premières entreprises dont le prix max est le plus petit. Si les gens prennent la peine de demander un prix, c'est pas pour que tu leur donnes plus haut me semble. Mais bon.
0
Non mais c'est si il n'y a pas d'entreprises dans leurs prix, il faut quand même que je leur trouves 3 entreprises les moins chères possibles.
0
Kcazer Messages postés 26 Date d'inscription lundi 5 mai 2008 Statut Membre Dernière intervention 13 août 2008 21
7 août 2008 à 15:13
Bonjour,

En supposant que tes bases soient entreprises(nom_entreprise,prix_min,prix_max) et particuliers(prix_min,prix_max), je pense qu'une requête de ce genre pourrait fonctionner:
SELECT E.nom_entreprise FROM entreprises E, particuliers P WHERE 1
ORDER BY (ABS(E.prix_min - P.prix_min) + ABS(E.prix_max - P.prix_max))
LIMIT 1,3

Pour chacune des entreprises:
- On calcule la difference absolue entre le prix min du particulier et celui de l'entreprise
- On fait pareil pour les prix max
- On additionne ces 2 valeurs
- On retourne le nom des 3 entreprises dont la somme est la plus petite

A noter que je n'ai pas testé ce code, il est donc possible qu'il ne fonctionne pas correctement, mais le pricipe est là ;)
0