2011-07-23 12 views
7

Tengo un sistema de clasificación muy simple en mi base de datos donde cada calificación se almacena como una enumeración ('1', '- 1'). Para calcular el total He intentado utilizar esta declaración:NÚMERO: Mysql que convierte Enum a Int

SELECT SUM(CONVERT(rating, SIGNED)) as value from table WHERE _id = 1 

Esto funciona muy bien para el positivo 1, pero por alguna razón el -1 se analiza fuera a 2 de.

¿Alguien puede ayudar u ofrecer incitación?

¿O debería renunciar y simplemente cambiar la columna a un SIGNED INT (1)?

Respuesta

3

Sí, le sugiero que cambie el tipo de columna. El problema se pone de manifiesto cuando lee el doc about enum type (¡que recomienda encarecidamente no usar números como valores de enumeración!) - se devuelve el índice del elemento enum, no el valor enum mismo.

+0

Bueno, sería incluso más descriptivo para cambiar la enumeración valores a 'up' y' down'! –

+1

Quizás, pero si necesita hacer mucho de este tipo de "aritmética de calificación" rápidamente se vuelve tedioso (y lento) ... mucho más simple de operar con "valores enteros simples". – ain

+0

Sí, seguí adelante y lo cambié después de publicar esta pregunta. Gracias por la explicación tho. Muy útil – NSjonas

0

uso

SELECT SUM(IF(columnname >0, CAST(columnname AS CHAR) , NULL)) AS vals 
FROM `tableName` 
+1

¡Hola! ¿Cómo ayuda esto? Siéntase libre de explicar un poco más y de usar [formato de código] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks). –

0

Ok chicos,

Sólo había un poco de una mera de un tiempo con éste. Aprendí que no debería usar ENUMs donde enteros son los valores. Sin embargo, tuvimos años de datos y no pude alterar la base de datos.

Este chico malo trabajó (convirtiéndolo en un personaje, luego en un int firmado).

CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1 
13

esto es lo que quiere

select enum+0 as enum 
9

Esta conversión a int en MySQL para enum sólo es posible:

CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1 
+0

Esa debería ser la solución aceptada –