[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: select и update в одном запросе
Gradus
давненько я не кодил smile.gif
задача:
обновить рандомную строку(ORDER BY RAND() LIMIT 1) , а точнее колонку type (там тип enum со значениями yes и no) и нужно заменить на противоположное без ручной прописи 'yes' или 'no', то есть сам sql если нашёл 'yes' поменял на 'no' и наоборот и вытащить новые значения.
Всё это желательно сделать в одном запросе.
Ну и всё я повис на том что не помню или не знаю как обновить и вытащить значения в одном запросе))



Спустя 17 минут, 27 секунд (10.07.2011 - 14:19) waldicom написал(а):
Типа такого:

UPDATE `your_table` SET `field` = IF(field = 'yes' , 'no', 'yes');

Спустя 42 минуты, 4 секунды (10.07.2011 - 15:01) Invis1ble написал(а):
Gradus
Одним запросом вроде никак не сделаешь такое. Можно так примерно:
select @id := `id` from `table` order by rand() limit 1;
update `table` set `type` = if(`type` = 'yes','no','yes') where `id` = @id;
select * from `table` where `id` = @id;

Спустя 6 минут, 44 секунды (10.07.2011 - 15:08) Invis1ble написал(а):
или так:
update `table` set `type` = if(`type` = 'yes', 'no', 'yes') where `id` = (
select @id := `id` from (
select `id` from `table` order by rand() limit 1
) t1
);
select * from `table` where `id` = @id;

но думаю, первый вариант оптимальней

Спустя 5 минут, 30 секунд (10.07.2011 - 15:14) Gradus написал(а):
а без прописи в запросе 'no' или 'yes' возможно ?)
что то типо,
update `table`as b set `type` = (SELECT `type` FROM `table` WHERE `type`!=b.`type` LIMIT 1) order by rand() limit 1;

Invis1ble,что означает @id и :=

Спустя 5 минут, 7 секунд (10.07.2011 - 15:19) Invis1ble написал(а):
Gradus
Цитата
а без прописи в запросе 'no' или 'yes' возможно ?

а зачем тебе это? ты не знаешь возможных значений поля типа enum? smile.gif
Цитата
что означает @id и :=

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

Спустя 5 минут, 58 секунд (10.07.2011 - 15:25) Gradus написал(а):
Invis1ble,
Цитата
а зачем тебе это? ты не знаешь возможных значений поля типа enum?

это некий тест smile.gif
Цитата
переменная id и оператор присваивания соответственно

можешь скинуть инфу поподробней ?)

Спустя 3 минуты, 13 секунд (10.07.2011 - 15:28) Winston написал(а):
Цитата (Gradus @ 10.07.2011 - 15:14)
что означает @id и :=

Спустя 5 минут, 16 секунд (10.07.2011 - 15:33) ИНСИ написал(а):
Gradus тебе waldicom дал, вполне рабочий вариант и не надо изобретать велосипед smile.gif Чего ты придумываешь что-то?

Почитай тут: http://mysql.ru/docs/man/Control_flow_functions.html А именно:
Цитата
IF(expr1,expr2,expr3)
    Если expr1 равно значению ИСТИНА (expr1 <> 0 и expr1 <> NULL), то функция IF() возвращает expr2, в противном случае - expr3. В зависимости от контекста функция IF() может возвращать либо числовое, либо строковое значение:

    mysql> SELECT IF(1>2,2,3);
            -> 3
    mysql> SELECT IF(1<2,'yes','no');
            -> 'yes'
    mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
            -> 'no'



Спустя 2 минуты, 59 секунд (10.07.2011 - 15:36) Gradus написал(а):
INSIDIOUS, внимательней smile.gif это тест и тут не на производительность надо смотреть, а на условие.Вариант может и рабочий, но не подходящий.Я бы и сам обошёлся своими знаниями для "рабочего" варианта, но не тут то было smile.gif PHPprogramer, спс smile.gif

Спустя 2 минуты, 19 секунд (10.07.2011 - 15:39) Invis1ble написал(а):
Я чесно говоря так и не понял, что за тест и что конкретно ты хочешь сделать. Может опишешь поподробней, чтоб всем стало ясно?

Спустя 5 минут, 2 секунды (10.07.2011 - 15:44) Gradus написал(а):
условия:
1)В случайной строке изменить поле type на противоположное
2)Вытащить все поля из этой строки после изменения
Доп: Тип поля type имеет enum, и содержит всего два значения которые предположительно нам не известны.Всё это желательно в один-два запроса.

Спустя 59 секунд (10.07.2011 - 15:45) ИНСИ написал(а):
Цитата
это тест и тут не на производительность надо смотреть, а на условие

Нафига нужны знания и тесты - которые вредят самому себе? Если хочешь изучать sql - тогда учи правильно. Есть много хороших книг, читай и практикуйся. А то получиться - будешь еще одним поповым.

Говорю с желанием помочь smile.gif

Спустя 3 минуты, 4 секунды (10.07.2011 - 15:48) Gradus написал(а):
INSIDIOUS, да блин не в книжке дело.sql я знаю достаточно для исполнения своей работы.Но тут тест не от книжки и не для практики, давайте не будем выяснять откуда и зачем smile.gif Есть условия и задача, нет решения smile.gif

Спустя 6 минут, 58 секунд (10.07.2011 - 15:55) Invis1ble написал(а):
Gradus
Цитата
Тип поля type имеет enum, и содержит всего два значения которые предположительно нам не известны

тогда, имхо, нужно предварительно юзать
show columns from `table` like 'type'

парсить возможные варианты значений, а дальше подставлять их в варианты, приведенные выше
Цитата
Есть много хороших книг, читай и проктикуйся

поддерживаю

Спустя 12 минут, 54 секунды (10.07.2011 - 16:07) Gradus написал(а):
Цитата
поддерживаю
и я, читайте и практикуйтесь smile.gif
Цитата
тогда, имхо, нужно предварительно юзать

сомневаюсь что это имелось ввиду, я думаю нужно что-то типо того что я чуть ранее показал.

Спустя 2 минуты (10.07.2011 - 16:09) waldicom написал(а):
Я правильно понимаю, что все это необходимо сделать одним запросом?

Спустя 1 минута, 40 секунд (10.07.2011 - 16:11) Gradus написал(а):
waldicom, да smile.gif ну или двумя не больше.

Спустя 1 минута, 39 секунд (10.07.2011 - 16:13) Invis1ble написал(а):
Gradus
Цитата
читайте и практикуйтесь

я это и так делаю, причем постоянно

Спустя 2 минуты, 29 секунд (10.07.2011 - 16:15) Gradus написал(а):
Invis1ble, ну значит мы одним делом занимаемся smile.gif

Спустя 4 минуты, 44 секунды (10.07.2011 - 16:20) waldicom написал(а):
Цитата (Gradus @ 10.07.2011 - 13:14)
а без прописи в запросе 'no' или 'yes' возможно ?)

Не, так нельзя. Так как enum не может знать, что значит !b

Спустя 2 минуты, 27 секунд (10.07.2011 - 16:22) Gradus написал(а):
waldicom, тут уже вопрос на интерес: а если тип не enum , а булевой допустим пройдёт такой вариант ? smile.gif

Спустя 1 минута, 41 секунда (10.07.2011 - 16:24) Invis1ble написал(а):
А булевого типа вроде нет в мускуле unsure.gif
есть insigned tinyint(1)

Спустя 4 минуты, 28 секунд (10.07.2011 - 16:29) Gradus написал(а):
Invis1ble, у phpmyadmin это bool псевдоним tinyint я к этому привык smile.gif

Спустя 1 минута, 56 секунд (10.07.2011 - 16:31) Invis1ble написал(а):
Цитата
bool псевдоним tinyint

я в курсе, но это всего лишь псевдоним в phpmyadmin smile.gif
т.е. сам мускул об этом псевдониме не в курсе smile.gif

Спустя 1 минута, 34 секунды (10.07.2011 - 16:32) Gradus написал(а):
Invis1ble, идея то одна хоть и значения разные smile.gif

Спустя 43 секунды (10.07.2011 - 16:33) waldicom написал(а):
Парни, мне кажется, или тут уже все забыли о самом вопросе? smile.gif

Градус, а можно тупой вопрос? Точнее флудильный и не относящийся напрямую к теме... А нафига такие мучения? Просто можно/не можно? Или нужно решить стоящую задачу?

Спустя 1 минута, 27 секунд (10.07.2011 - 16:34) Invis1ble написал(а):
waldicom
Цитата
Парни, мне кажется, или тут уже все забыли о самом вопросе?

я не забыл, думал ты покажешь мастер-класс smile.gif

Спустя 6 минут, 23 секунды (10.07.2011 - 16:41) Gradus написал(а):
waldicom, трудно сказать.Тест на нужную должность, возможно с подковыркой.Но то что не ждут стандартных подходов это точно smile.gif Основная задача это обновить и вытащить в одном запросе, остальное думаю теперь можно и нарушить по условию smile.gif

Спустя 3 минуты, 36 секунд (10.07.2011 - 16:44) Invis1ble написал(а):
Gradus
думаешь, при прохождении тобой этого теста и попадания на "нужную должность", впоследствии никто не заметит, что на самом деле ты не соответствуешь занимаемой должности по уровню?

Спустя 10 минут, 26 секунд (10.07.2011 - 16:55) Invis1ble написал(а):
Gradus
update `table` set `type` = (!(`type` - 1)) + 1 where `id` = (
select @id := `id` from (
select `id` from `table` order by rand() limit 1
) t1
);
select * from `table` where `id` = @id;

с тебя 50% от первой зарплаты и плюс в карму

Спустя 1 минута, 47 секунд (10.07.2011 - 16:56) Gradus написал(а):
Invis1ble, почему ты пытаешься из меня маленького дурачка сделать ?)
тест не определит твой точный уровень, а скорей покажет в каких моментах ты справишься/не справишься.А если по твоему, значит пока никто тут до нужного уровня не дошёл, значит ищут била гейтса.Да из всего теста я застрял только на одном задании, сомневаюсь что через месяц скажут "мы наняли эксперта и он заметил в твоём коде на 33 строке , что эту строчку можно было на 2 символа меньше сократить, поэтому ты уволен".Да и кто из прогеров работает на убыль знаниям ? интересно воплощать то, что ещё не делал и решать новые задачки.

Спустя 1 минута, 54 секунды (10.07.2011 - 16:58) Invis1ble написал(а):
Gradus
Цитата
почему ты пытаешься из меня маленького дурачка сделать

отнюдь. Откуда такие выводы?
просто хотел узнать ход работы твоих мыслей по этому поводу.
ну в принципе с тобой согласен.

PS. Что скажешь по предложенному варианту кода?

Спустя 8 минут, 46 секунд (10.07.2011 - 17:07) Gradus написал(а):
Invis1ble, прозрачные намёки smile.gif
Цитата
Что скажешь по предложенному варианту кода?

Твоё решение удволитворило мой интерес по поводу tinyint (я почему-то даже не намерился поразмышлять), но не решило саму задачу, поэтому только огромное спс и плюс в карму smile.gif

Спустя 6 минут, 43 секунды (10.07.2011 - 17:14) Invis1ble написал(а):
Gradus
Цитата
не решило саму задачу,

ну ты даешь... Задача:
Цитата
1)В случайной строке изменить поле type на противоположное
2)Вытащить все поля из этой строки после изменения
Доп: Тип поля type имеет enum, и содержит всего два значения которые предположительно нам не известны.Всё это желательно в один-два запроса.

Решение:
Цитата
update `table` set `type` = (!(`type` - 1)) + 1 where `id` = (
select @id := `id` from (
select `id` from `table` order by rand() limit 1
) t1
);
select * from `table` where `id` = @id;

Так как так получается, что мой вариант не решает задачу? blink.gif

Спустя 11 минут, 9 секунд (10.07.2011 - 17:25) Gradus написал(а):
Invis1ble, протестил действительно решило.Не знал что enum значения можно передвигать smile.gif

Спустя 1 минута, 33 секунды (10.07.2011 - 17:27) Invis1ble написал(а):
Gradus
Я и сам не знал, но попробовал - оказывается можно smile.gif

Спустя 4 часа, 54 минуты, 43 секунды (10.07.2011 - 22:21) ИНСИ написал(а):
Gradus попробуй так:

mysql_query("
SELECT `t`.`type`,`t`.`id`
IF ( `t`.`id` NOT NULL ( UPDATE `table` SET `type` = ( SELECT `type` FROM `table` WHERE `type` <> `t`.`type` OR `type` = `t`.`type` LIMIT 1 ) WHERE `id` = `t`.`id`) )
FROM `table` AS `t`
ORDER BY RAND()
LIMIT 1
"
);

Спустя 17 минут, 40 секунд (10.07.2011 - 22:39) Invis1ble написал(а):
INSIDIOUS
не знаю, сработает ли в принципе такой запрос или нет, но вижу логическую ошибку, имхо:
Цитата
SET `type` = ( SELECT `type` FROM `table` WHERE `type` <> `t`.`type` LIMIT 1 )

а если не будет записей, удовлетворяющих условию?

PS. А вообще, инетересный хак - запихнуть апдейт в заведомо верное условие

Спустя 42 минуты, 37 секунд (10.07.2011 - 23:22) ИНСИ написал(а):
Цитата
не знаю, сработает ли в принципе такой запрос или нет, но вижу логическую ошибку, имхо:

Тогда просто стоит дописать еще условие OR `type` = `t`.`type`.

Спустя 9 минут, 2 секунды (10.07.2011 - 23:31) Invis1ble написал(а):
Цитата
Тогда просто стоит дописать еще условие OR `type` = `t`.`type`

тогда при невыполнении первой части условия значение `type` в итоге останется неизменным smile.gif

Спустя 24 минуты, 54 секунды (10.07.2011 - 23:55) ИНСИ написал(а):
Цитата
тогда при невыполнении первой части условия значение `type` в итоге останется неизменным smile.gif

Ты издеваешься надо мной?

Спустя 7 минут, 45 секунд (11.07.2011 - 00:03) Invis1ble написал(а):
INSIDIOUS
нет, а что я не прав? разве type поменяется, если `type` = `t`.`type` вернет true ?
И вообще, выражение `type` <> `t`.`type` OR `type` = `t`.`type` всегда будет true, поэтому получается where можно опустить. В итоге type примет значение первой записи из result-set (т.е. не обязательно противоположное прежнему)

Спустя 10 часов, 17 минут, 48 секунд (11.07.2011 - 10:21) ИНСИ написал(а):
UPDATE `table` SET `type` = ( SELECT `type` FROM `table` WHERE `type` <> `t`.`type` OR `type` = `t`.`type` LIMIT 1 ) WHERE `id` = `t`.`id`

Invis1ble - нам не true надо вернуть. Нам надо вернуть противоположный `type` нынешнему. Первый раз ты верно подметил, что в случае отсутствия будет ошибка, поэтому чтобы не было ошибок - просто вернем старое значение.

Спустя 2 часа, 36 минут, 28 секунд (11.07.2011 - 12:57) Invis1ble написал(а):
INSIDIOUS
Правильно, нужно вернуть противоположный type.
Ты же сам пишешь, "вернем старое значение", а нужно противоположное. Вот об этом я и хотел сказать.


_____________
ДАВАЙ ДЕНЬГИ
R543264623869
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.