[MYSQL] Notion de "le plus proche"
otherwise01
-
Kcazer Messages postés 26 Statut Membre -
Kcazer Messages postés 26 Statut Membre -
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
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
A voir également:
- [MYSQL] Notion de "le plus proche"
- Paypal envoyer de l'argent à un proche - Guide
- Mysql community download - Télécharger - Bases de données
- Les données fournies dans le fichier à télécharger peuvent être synthétisées par le tableau récapitulatif ci-dessous. dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des quatre premières colonnes. il manque 5 valeurs dans le tableau ci-dessous. retrouvez-les dans votre tableau, puis reportez-les arrondies à l’entier le plus proche. - Guide
- Localiser un proche - Guide
- Commander un uber pour un proche - Accueil - Guide transports et cartes
12 réponses
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).
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).
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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)
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...
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...
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.
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...
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...
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é.
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é.
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.
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.
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.
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.
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.
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:
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à ;)
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à ;)