[MYSQL] Notion de "le plus proche"

otherwise01 -  
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
Configuration: Windows Vista
Firefox 3.0

12 réponses

  1. X-Fan Messages postés 811 Statut Membre 24
     
    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
  2. otherwise01
     
    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
  3. X-Fan Messages postés 811 Statut Membre 24
     
    Ok mais c'est une requête incluse dans une page php?
    0
  4. otherwise01
     
    Bah oui. C'est vrai que j'ai oublié de le préciser.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. X-Fan Messages postés 811 Statut Membre 24
     
    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
  7. otherwise01
     
    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
  8. otherwise01
     
    Ou alors:

    Le prixminuser qui est le plus proche du prixmaxentreprise... ?
    0
  9. X-Fan Messages postés 811 Statut Membre 24
     
    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
    1. otherwise01
       
      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
  10. X-Fan Messages postés 811 Statut Membre 24
     
    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
    1. otherwise01
       
      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
  11. X-Fan Messages postés 811 Statut Membre 24
     
    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
  12. otherwise01
     
    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
  13. Kcazer Messages postés 26 Statut Membre 21
     
    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