Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вычисление в запросе дает неверный результат  (Прочитано 17477 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Arina
Гость
« : 02-06-2004 15:53 » 

Вот такая ерунда:

Код:
SELECT a, 3-a as diff
         FROM tbl_name;


В результате получаю:

а | diff
--   ---
2    0
2    0
3   -1
1    1

Почему так происходит, подскажите?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 02-06-2004 16:12 » 

может
Код:
)3-а: as diff
... но я не знаю
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Arina
Гость
« Ответ #2 : 02-06-2004 16:20 » new

щас попробую
Записан
Arina
Гость
« Ответ #3 : 02-06-2004 16:21 » 

не помогло....

а вот
Код:
SELECT a, a+3 as diff
         FROM tbl_name;
это работает  Я шокирован!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 02-06-2004 19:28 » 

Arina, сккажи, чем пользуешься - какая БД?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #5 : 03-06-2004 05:11 » 

Arina, такое ощущение что у тебя в запросе вместо 3 2 стоит

SELECT a, 2-a as diff
FROM tbl_name;

тогда и ответы будут как у тебя
Записан

I Have Nine Lives You Have One Only
THINK!
Arina
Гость
« Ответ #6 : 03-06-2004 07:51 » 

Использую MySQL 4.0
Запрос элементарен:

select a, 3-a as diff
from table_name;

там именно 3 - обычной цифрой, а считает, действительно, будто стоит 2   Вот такой я вот
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 03-06-2004 08:03 » 

чудес не бывает..... а пробовала select a, -a+3 as diff ... ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 03-06-2004 08:05 » 

Arina, проверил на 4.0.18 и 3.23.49 - работает нормально.
Попробуй что-то поменять. Напр., используй другую таблицу, другой тип столбца и его атрибутов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Arina
Гость
« Ответ #9 : 03-06-2004 08:09 » 

в общем-то, тип поля: a enum('0','1','2','3') - может в этом все дело?

Сейчас изменила a enum('1','2','3') - и все нормально стало работать.
Странно.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 03-06-2004 08:28 » 

блин Улыбаюсь ничего странного. ты его объявила не целым, а множеством, третий элемент которого - 2. в селекте ты обращаешься к второму элементу этого множества (по его индексу), т.е. фактически, ты пишешь 2 - а.
Записан

Arina
Гость
« Ответ #11 : 03-06-2004 08:37 » 

x77, не поняла - почему обращаюсь ко 2 элементу?

select a(первый элемент), 3-a(второй элемент) - так что-ли?

А ведь у меня определены все а - разве не должен селект выбирать построчно значения:

а=3=>3-a=0
а=2=>3-a=1
а=3=>3-a=0
а=1=>3-a=2

Не понял
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #12 : 03-06-2004 08:43 » 

вообще говоря, в майскл в выражениях, содержащих перечисляемые типы (т.е. енумы) цифры трактуются как индексы енумов. поэтому енумы не рекомендуется использовать для хранения цифр, только строк, во избежание путаницы.

у тебя оно не начало правильно работать Улыбаюсь просто под индексом третьего элемента у тебя сейчас стоит не 2, как раньше, а 3. напиши, например, 10-а - и будут те же грабли. корректное решение - это изменить тип на целочисленный.

можно, по идее, приводить енум к стрингу, как это делает Load Data, например, но в любом случае будет путаница и заморочки.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #13 : 03-06-2004 08:48 » 

Arina, нет.

у тебя есть енум:
Код:

  индекс   1 2 3 4
  элемент  0 1 2 3


ты пишешь select a, 3-a

это то же самое, что select a, a[3] - a.

в первом случае a[3] было равно 2. потом ты убила первый элемент, ноль, индексы сместились, a[3] стало равно 3. и ты решила, что всё заработало. на самом деле, это не так Улыбаюсь
Записан

Arina
Гость
« Ответ #14 : 03-06-2004 10:04 » 

ok, спасибо за науку:)

изменю тип:)
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 03-06-2004 10:22 » 

Arina, удачи Ага
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 03-06-2004 10:40 » 

Цитата: x77
ты пишешь select a, 3-a

это то же самое, что select a, a[3] - a.

в первом случае a[3] было равно 2. потом ты убила первый элемент, ноль, индексы сместились, a[3] стало равно 3. и ты решила, что всё заработало. на самом деле, это не так Улыбаюсь

x77, что-то я не понимаю, как у тебя константа "3" превратилась в "a[3]"?

Arina, рекомендую почитать мануал mysql-я, раздел "MySQL Language Reference" - в описании каждого типа рассказывается о его поведении. А так же почитай там же о интерпретации и преобразовании типов в выражениях.
Цитата
If you retrieve an ENUM in a numeric context, the column value's index is returned.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #17 : 03-06-2004 11:17 » 

RXL, в данном случае не константа, а индекс элемента. чтобы получить значение самого элемента. в мануале, кстати, чуть ниже твоей цитаты есть такие строчки:
Цитата

For example, you can retrieve numeric values from an ENUM column like this:

mysql> SELECT enum_col+0 FROM tbl_name;



т.е. здесь идёт обращение к 0-му элементу. а Arina обратилась к третьему, вот и всё.
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 03-06-2004 11:54 » 

x77, тут вовсе не ображение к нулевому элементу. "+0" - это принудительный перевод к числовому контексту. Результат -  index+0.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #19 : 03-06-2004 12:03 » 

RXL, дома проверю, здесь у меня нет рабочей базы. отложим до завтра, ok? Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines