SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.11.2013 12:30:20

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

SUM и BLOB

Здравствуйте, у меня такой вот запрос и он почему то работает не так как я этого жду.

SELECT user,
@item:=round(sign(vote)*log(vote)),
@item:=if(@item is NULL, vote, @item),
@item AS sum
FROM post WHERE (vote>15 OR vote<0) GROUP BY user


Возвращает сумму оценок к постам но только поле sum возвращается как BLOB и если сделать так:

SUM(@item) AS sum

вернет совсем не тот результат который я ожидаю

Неактивен

 

#2 24.11.2013 13:23:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SUM и BLOB

поясните на примере

Неактивен

 

#3 24.11.2013 13:49:35

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: SUM и BLOB

Результат запроса для одного пользователя(установлена галочка Показать BLOB содержимое):

user     @item:=round(sign(vote)*log(vote))    @item:=if(@item is NULL, vote, @item)    sum
16         6                                                       6                                                           6
16         NULL                                                -5                                                          -5


а если, посчитать сумму (sum(@item) AS sum):

user     @item:=round(sign(vote)*log(vote))    @item:=if(@item is NULL, vote, @item)    sum
16         6                                                      6                                                          12

Хотя ожидал что будет поле sum = 1

Отредактированно Марк (24.11.2013 13:52:33)

Неактивен

 

#4 24.11.2013 14:28:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SUM и BLOB

Это из-за того, что присваивание и чтение значений пользовательских переменных происходят на разных стадиях обработки запроса.

Нужно

select user, sum(s) from (
SELECT user,
@item:=round(sign(vote)*log(vote)),
@item:=if(@item is NULL, vote, @item),
@item AS s
FROM post WHERE (vote>15 OR vote<0) ) t
GROUP BY user

Неактивен

 

#5 24.11.2013 14:41:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SUM и BLOB

Кстати, а зачем вам вообще здесь пользовательские переменные:

SELECT user, sum(ifnull(round(sign(vote)*log(vote)), vote))
FROM post WHERE (vote>15 OR vote<0) GROUP BY user

Неактивен

 

#6 24.11.2013 15:09:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: SUM и BLOB

Ну а если все же использовать переменные, то перед запросом на всякий случай определяйте тип переменной ( SELECT @my_var:=0; ).
Обсуждалось в http://bugs.mysql.com/bug.php?id=61408


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 24.11.2013 16:18:30

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: SUM и BLOB

Спасибо, помогли))

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson