J'utilise je veux ... p> mais je ne peux pas utiliser si Comment puis-je faire cela dans mysql? < / p> p> mysql code> et
codeigniter code>. J'ai des numéros de points flottants dans ma base de données tels que
valeur = $ myvalue code> dans ma requête SELECT parce que
$ myvalue code> n'est pas exactement égal aux valeurs de la base de données. J'ai besoin d'obtenir la valeur la plus proche sur
$ myvalue code> à partir de la base de données. p>
$ myvalue code> est 5 Je veux sélectionner la valeur
4.5556 code>. p>
11 Réponses :
Prenez la première valeur à partir des éléments suivants:
select * from table order by abs(value - $myvalue);
SELECT * FROM table1 ORDER BY ABS(value - '$myvalue') LIMIT 1
En supposant que vous avez une tolérance de 10% (+/-), vous pouvez essayer quelque chose comme:
select * from table where value >= ($myvalue * .9) and value <= ($myvalue * 1.1) order by abs(value - $myvalue) limit 1
Et si la myvalue de $ la plus proche est plus que votre% arbitraire de toute valeur?
L'exigence initiale n'est pas très claire. Bien sûr, s'il n'y a pas de "portée acceptée", vous pouvez dire que 10000000000 est suffisamment proche de "1", en supposant qu'il n'y ait rien de mieux dans votre DB. Dans ce cas, vous pouvez laisser tomber la partie "où".
Notez que cela échouera si $ myvalue code> est 0. Si vous voulez vraiment faire cela, vous devez ajouter
ou (($ molvalue> = (valeur * .9)) et myvalue <= (valeur * 1.1))) code>
Cela ne montrera pas la valeur la plus proche s'il mettra 6 par exemple -> Cependant, vous étiez sur la bonne voie avec le> = et
Lire cette page http: //dev.mysql .com / doc / Refman / 5.1 / fr / mathématique-fonctions.html # Fonction_round
Mais votre sélection ressemblerait à ce p>
select value from table where ROUND(value) = $myvalue
Et si le $ myvalue $> est-il supérieur à 1 de toute valeur?
@Bohemian - à un moment donné, vous allez avoir besoin d'un point de coupure pour correspondre à la valeur
@Bohemian, non, vous ne dépendez pas entièrement de votre application, et si b> vous avez besoin d'une coupure, elle doit toujours être un pourcentage des valeurs d'origine. Et si vous ne traitez pas avec 8.12 code>, mais avec
15 481 254,454 875 544 4545.1 code>?
La question est claire: "Choisissez la la plus proche i> valeur". Cela ne dit rien de à quelle distance i> la valeur est ... pourrait être de 1000. Votre réponse est tout simplement "fausse".
select * from table order by abs(value - $myvalue) limit 1
Fait probablement une balayage de table (lente).
Malheureusement, je pense que votre base de données fera probablement une analyse de la table complète des solutions impliquant ABS code>, afin qu'ils soient (très) lent une fois que votre table se développe. Une solution rapide peut être trouvée dans ce Thread antérieur . p>
SELECT number, ABS( number - 2500 ) AS distance FROM numbers ORDER BY distance LIMIT 6 Selecting closest values in MySQL
( select * from table where value >= $myvalue order by value asc limit 1 ) union ( select * from table where value < $myvalue order by value desc limit 1 ) order by abs(value - $myvalue) limit 1 This may look counter-intuitive but the speed will be greater than the other queries shown so far.This is due to the fact that a greater than and less than query is quicker.Then doing an ABS on two values is nothing.This will give you the quickest return in a single query I can think of.Doing an ABS on a whole table will be slow as it will scan the whole table.
Essayez ceci:
SELECT *,abs((columnname -Yourvalue)) as near FROM table WHERE order by near limit 0,1
Obtenez la plus grande valeur similaire à $ VAL:
SELECT * FROM tab ORDER BY abs(val - $val) LIMIT 1
Dans mon cas, j'utilisais les géolocations des navigateurs et j'essayais de trouver une ville / un état le plus proche basé sur les coordonnées que j'avais dans une table.
Structure de table: p>
$city = Zipcodes::selectRaw ('city_state, zipcode, ( ABS( lat - ? ) + ABS( lon - ?) ) AS distance', [$lat, $lon]) ->orderBy('distance') ->first(); echo $city->city_state
Si vous avez quelques lignes, les réponses vers le haut seront suffisantes - Toutefois, si vous avez des millions de lignes, je ne les recommanderais pas, car ils numériseront toute la table - voir ma réponse au bas (le compromis étant lisibilité comme La requête est beaucoup plus longue - mais beaucoup plus rapide aussi)