2011-07-23 16 views
7

Mam bardzo prosty system oceniania w mojej bazie danych, gdzie każda ocena jest przechowywana jako wyliczenie ("1", "- 1"). Aby obliczyć sumę Próbowałem za to stwierdzenie:PROBLEM: Konwersja Mysql do En

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

Działa to dobrze dla pozytywnego 1, ale z jakiegoś powodu -1 są analizowane się do 2 roku.

Czy ktoś może pomóc lub podburzać?

Czy powinienem zrezygnować i po prostu zmienić kolumnę na PODPISANĄ INT (1)?

Odpowiedz

3

Tak, sugeruję zmianę typu kolumny. Problem staje się jasny, gdy czytasz doc about enum type (który zdecydowanie zaleca, aby nie używać liczb jako wartości wyliczenia!) - zwracany jest indeks elementu wyliczeniowego, a nie sama wartość wyliczeniowa.

+0

Cóż, byłoby jeszcze bardziej opisowe zmienić enum wartości do 'up' i' down'! –

+1

Być może, ale jeśli będzie musiał wykonać wiele tego rodzaju "arytmetycznych ocen", szybko stanie się nudny (i wolny) ... o wiele prostszy w obsłudze z "zwykłymi wartościami całkowitymi". – ain

+0

Tak, poszedłem do przodu i zmieniłem go po wysłaniu tego pytania. Dzięki za wyjaśnienie. Bardzo pomocna – NSjonas

0

użycie

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

Cześć! Jak to pomaga? Możesz wyjaśnić nieco więcej i użyć [formatowania kodu] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks). –

0

Ok chłopaki,

tylko miał trochę jedynie od czasu z tego. Nauczyłem się, że nie powinienem używać ENUMs gdzie wartości całkowite są wartościami. Jednak mieliśmy dane z lat i nie mogłem zmienić bazy danych.

Ten bad boy pracował (zmieniając go w postać, a następnie w podpisane int).

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

to co chcesz

select enum+0 as enum 
9

Ta konwersja do int w MySQL dla enum jest możliwe tylko:

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

To powinno być akceptowane rozwiązanie –