[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
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
A voir également:
- [MYSQL] Notion de "le plus proche"
- Mysql download - Télécharger - Bases de données
- Paypal paiement entre proche - Guide
- Mysql error in file: /engine/classes/mysql.php at line 53 ✓ - Forum Réseaux sociaux
- Les données fournies dans le fichier à télécharger peuvent être synthétisées par le tableau récapitulatif suivant. dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des 4 premières colonnes. cinq valeurs manquent dans le tableau suivant. retrouvez-les dans votre tableau puis reportez-les, arrondies à l’entier le plus proche, dans la zone de réponse. ✓ - Forum Excel
- Mysql a répondu : documentation connexion impossible : paramètres incorrects. - Forum Bases de données
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
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).
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
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
5 août 2008 à 16:10
Ok mais c'est une requête incluse dans une page php?
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
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)
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...
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
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.
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...
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
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é.
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.
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
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.
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.
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
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:
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à ;)