Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как организовать проверку в SELECT, Запрос с переменными или под запрос 
:(
    Опции темы
steven13
  Дата 15.5.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2005
Где: http://city.vin.c om.ua

Репутация: нет
Всего: нет



Есть таблица ТЕСТ, её содержание:


adres col1 col2 col3 res
col1 1 2 3
col2 3 4 5
col1 7 4 3
col3 2 3 3
....

В первой колонке имя колонки с которой нужно работать.
Нужно помотреть что в adres, и его например умножить на 2 и записать в res.

Вот мой неработающий вариант:

Код

update test set  @aaa:=adres, res=@aaa*2 FROM test 


Кажись pдесь некоректная робота с переменными.

Сейчас я делаю это в цикле. Но хочется от него избавится и сделать в одном запросе именно на МиСКЛ.

Это сообщение отредактировал(а) steven13 - 15.5.2005, 21:54
PM MAIL WWW ICQ   Вверх
Illuminaty
Дата 15.5.2005, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 3
Всего: 56



Насколько я понимаю, aaa - переменная, в ней хранится одно! значение.
Значение, а не имя поля. Даже если бы пример работал, то в res оказалось бы значение 'col1' * 2 (к примеру). Можно переменные использовать так (пример с оф. сайта)
Код

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

В MySQL можно задавать переменные непосредственно или через SELECT. Больше, кажется, никак.
Почему бы не сделать проще?
Код

UPDATE test SET res=col1*2 WHERE adres='col1';
UPDATE test SET res=col2*2 WHERE adres='col2';
UPDATE test SET res=col3*2 WHERE adres='col3';

Может так проще smile ?
PM MAIL ICQ   Вверх
steven13
Дата 15.5.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2005
Где: http://city.vin.c om.ua

Репутация: нет
Всего: нет



Так и работает. smile

Только это большая таблица с громадными формулами. Оброботка проходит около десяти минут.


И хотелось-бы это сделать одним запросом.
PM MAIL WWW ICQ   Вверх
Illuminaty
Дата 15.5.2005, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 3
Всего: 56



Я, конечно, сделал все в одном запросе, но это большой изврат хотя и красивый smile
Пусть adres - BINARY(2) и в нем хранятся номера столбцов, с которыми будет происходить операция умножения. Теперь сам запрос
Код

UPDATE test SET res = (((adres >> 1) ^ 1) * col1 + ( (adres ^ 3) & 1) * col2 +((adres - 1)>> 1) * col3) * 2

Данный запрос работает на 100%!
Попробуй smile
PM MAIL ICQ   Вверх
steven13
Дата 16.5.2005, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2005
Где: http://city.vin.c om.ua

Репутация: нет
Всего: нет



Супер!!!!!!!!!!
Работает!

Идею я понял.
Одна проблема. Я тут упростил задачу, у меня не 3 колонки а 9!!!


Где об этом почитать.
И я нехняю что делает оператор >>/ smile
PM MAIL WWW ICQ   Вверх
Illuminaty
Дата 16.5.2005, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 3
Всего: 56



>> - это оператор битового сдвига вправо
почитать можно здесь(ссылочку на весь сайт запомни - пригодится еще smile )
С 9 столбцами там другие выражения придется использовать - эти только для 3!
Ты сначала на скорость протести прежде чем для 9 писать

PM MAIL ICQ   Вверх
steven13
Дата 16.5.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2005
Где: http://city.vin.c om.ua

Репутация: нет
Всего: нет



Огромное спасибо!
Завтра всё прочитаю!
Очень помог!!!
Я уже это привентил в другой части! И работает!!! smile



Возможно есть и другие способа? smile
Например применимые для 9 столбцов!!!
PM MAIL WWW ICQ   Вверх
Illuminaty
Дата 16.5.2005, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 3
Всего: 56



Лучше столбцы нумеровать с 0 но 8, а в adres хранит степени 2, т.е. 1 соответствует col0, 2 - col1, 4 - col2, 8 - col3, ..., 256 - col8.
Тогда запрос принимает менее извратный вид:
Код

UPDATE test SET res = ((adres & 1)*col0 + ((adres >> 1) & 1)*col1 + ((adres >> 2) & 1)*col2 + ((adres >> 3) & 1)*col3 + ... + ((adres >> 8) & 1)*сol8)*2

Так то лучше будет? smile

Это сообщение отредактировал(а) Illuminaty - 16.5.2005, 00:34
PM MAIL ICQ   Вверх
steven13
Дата 16.5.2005, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2005
Где: http://city.vin.c om.ua

Репутация: нет
Всего: нет



Работает!
smile


PM MAIL WWW ICQ   Вверх
setnull
Дата 2.5.2010, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: нет
Всего: 1



можно еще так

Код

update my_table
set
 res = case
     when adres = 'clo1' then col1
     when adres = 'col2' then col2
..................
     when adres = 'colN' then colN
     else null
 end



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.