2010-02-28 5 views
1

Disons que vous avez une chaîne 3.4564.Récupération d'un enregistrement tronqué à partir de la base de données mysql

Un ensemble d'échantillons dans la base de données a ces enregistrements (VARCHAR):

Name  Score 

Peter  3.35643294332 
John  3.47870923 
James  3.740249842 
Henry  4.0432849 
Solomon 3.456183923 
Andrew  3.45743 

Vous voulez tronquer 3,4564 à 3 décimales (pour devenir 3,456) puis comparer avec les valeurs de la base de données que lorsque arrondi à trois décimales donneront la même valeur que 3,456, c'est-à-dire récupérer le nom 'Solomon'

Quelle est la meilleure façon d'y parvenir en PHP mysql?

+0

pourquoi les partitions sont-elles stockées en tant que texte et non en tant que nombres? – cherouvim

+0

Parce que celui qui a créé la table pensait que ce serait plus facile à gérer ... maintenant c'est moi qui en paierai le prix. – erastusnjuki

Répondre

3

Si vos colonnes de partition contiennent des données stockées en tant que varchar, vous pouvez les convertir en décimal à l'aide de la fonction CAST. Par exemple:

mysql> select cast('3.35643294332' as decimal(10,3)); 
+----------------------------------------+ 
| cast('3.35643294332' as decimal(10,3)) | 
+----------------------------------------+ 
|         3.356 | 
+----------------------------------------+ 
1 row in set (0,01 sec) 


Et notez cela va arrondir les valeurs correctement:

mysql> select cast('3.35663294332' as decimal(10,3)); 
+----------------------------------------+ 
| cast('3.35663294332' as decimal(10,3)) | 
+----------------------------------------+ 
|         3.357 | 
+----------------------------------------+ 
1 row in set (0,00 sec) 

-à-dire:

  • '3.3564' a été casté à 3.356
  • et '3.3566' a été casté à 3.357


Maintenant, il vous suffit d'utiliser cette fonction cast dans vos comparaisons dans votre clause where.

Je suppose que quelque chose comme cela devrait fonctionner, par exemple:

select * 
from your_table 
where cast(Score as decimal(10,3)) = cast('3.4564' as decimal(10,3)) 

à savoir, vous convertir à la fois la « entrée » et le score à 3 décimales avec décimales; et vous convertissez ces valeurs. Pour ce faire, vous n'utiliserez aucun index que vous pourriez avoir sur Score, et vous obtiendrez toujours un scan complet ... Ce qui signifie qu'une autre solution serait meilleure. Par exemple, si vous pouviez utiliser une clause where comme score >= X and Score <= Y, ce serait beaucoup mieux ...

Mais, comme Score est stocké en tant que varchar, ce ne sera pas si facile, je suppose - vous devriez stocker ceux-ci en tant que décimales, btw ...

Questions connexes