
задача:
обновить рандомную строку(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' возможно ?)
что то типо,
Invis1ble,что означает @id и :=
что то типо,
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?

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

Цитата |
переменная id и оператор присваивания соответственно |
можешь скинуть инфу поподробней ?)
Спустя 3 минуты, 13 секунд (10.07.2011 - 15:28) Winston написал(а):
Спустя 5 минут, 16 секунд (10.07.2011 - 15:33) ИНСИ написал(а):
Gradus тебе waldicom дал, вполне рабочий вариант и не надо изобретать велосипед
Чего ты придумываешь что-то?
Почитай тут: http://mysql.ru/docs/man/Control_flow_functions.html А именно:

Почитай тут: 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, внимательней
это тест и тут не на производительность надо смотреть, а на условие.Вариант может и рабочий, но не подходящий.Я бы и сам обошёлся своими знаниями для "рабочего" варианта, но не тут то было
PHPprogramer, спс



Спустя 2 минуты, 19 секунд (10.07.2011 - 15:39) Invis1ble написал(а):
Я чесно говоря так и не понял, что за тест и что конкретно ты хочешь сделать. Может опишешь поподробней, чтоб всем стало ясно?
Спустя 5 минут, 2 секунды (10.07.2011 - 15:44) Gradus написал(а):
условия:
1)В случайной строке изменить поле type на противоположное
2)Вытащить все поля из этой строки после изменения
Доп: Тип поля type имеет enum, и содержит всего два значения которые предположительно нам не известны.Всё это желательно в один-два запроса.
1)В случайной строке изменить поле type на противоположное
2)Вытащить все поля из этой строки после изменения
Доп: Тип поля type имеет enum, и содержит всего два значения которые предположительно нам не известны.Всё это желательно в один-два запроса.
Спустя 59 секунд (10.07.2011 - 15:45) ИНСИ написал(а):
Цитата |
это тест и тут не на производительность надо смотреть, а на условие |
Нафига нужны знания и тесты - которые вредят самому себе? Если хочешь изучать sql - тогда учи правильно. Есть много хороших книг, читай и практикуйся. А то получиться - будешь еще одним поповым.
Говорю с желанием помочь

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


Спустя 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 написал(а):
Цитата |
поддерживаю |
и я, читайте и практикуйтесь 

Цитата |
тогда, имхо, нужно предварительно юзать |
сомневаюсь что это имелось ввиду, я думаю нужно что-то типо того что я чуть ранее показал.
Спустя 2 минуты (10.07.2011 - 16:09) waldicom написал(а):
Я правильно понимаю, что все это необходимо сделать одним запросом?
Спустя 1 минута, 40 секунд (10.07.2011 - 16:11) Gradus написал(а):
waldicom, да
ну или двумя не больше.

Спустя 1 минута, 39 секунд (10.07.2011 - 16:13) Invis1ble написал(а):
Gradus
Цитата |
читайте и практикуйтесь |
я это и так делаю, причем постоянно
Спустя 2 минуты, 29 секунд (10.07.2011 - 16:15) Gradus написал(а):
Invis1ble, ну значит мы одним делом занимаемся

Спустя 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 , а булевой допустим пройдёт такой вариант ?

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

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

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

т.е. сам мускул об этом псевдониме не в курсе

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

Спустя 43 секунды (10.07.2011 - 16:33) waldicom написал(а):
Парни, мне кажется, или тут уже все забыли о самом вопросе? 
Градус, а можно тупой вопрос? Точнее флудильный и не относящийся напрямую к теме... А нафига такие мучения? Просто можно/не можно? Или нужно решить стоящую задачу?

Градус, а можно тупой вопрос? Точнее флудильный и не относящийся напрямую к теме... А нафига такие мучения? Просто можно/не можно? Или нужно решить стоящую задачу?
Спустя 1 минута, 27 секунд (10.07.2011 - 16:34) Invis1ble написал(а):
waldicom
Цитата |
Парни, мне кажется, или тут уже все забыли о самом вопросе? |
я не забыл, думал ты покажешь мастер-класс

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


Спустя 3 минуты, 36 секунд (10.07.2011 - 16:44) Invis1ble написал(а):
Gradus
думаешь, при прохождении тобой этого теста и попадания на "нужную должность", впоследствии никто не заметит, что на самом деле ты не соответствуешь занимаемой должности по уровню?
думаешь, при прохождении тобой этого теста и попадания на "нужную должность", впоследствии никто не заметит, что на самом деле ты не соответствуешь занимаемой должности по уровню?
Спустя 10 минут, 26 секунд (10.07.2011 - 16:55) Invis1ble написал(а):
Gradus
с тебя 50% от первой зарплаты и плюс в карму
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 символа меньше сократить, поэтому ты уволен".Да и кто из прогеров работает на убыль знаниям ? интересно воплощать то, что ещё не делал и решать новые задачки.
тест не определит твой точный уровень, а скорей покажет в каких моментах ты справишься/не справишься.А если по твоему, значит пока никто тут до нужного уровня не дошёл, значит ищут била гейтса.Да из всего теста я застрял только на одном задании, сомневаюсь что через месяц скажут "мы наняли эксперта и он заметил в твоём коде на 33 строке , что эту строчку можно было на 2 символа меньше сократить, поэтому ты уволен".Да и кто из прогеров работает на убыль знаниям ? интересно воплощать то, что ещё не делал и решать новые задачки.
Спустя 1 минута, 54 секунды (10.07.2011 - 16:58) Invis1ble написал(а):
Gradus
Цитата |
почему ты пытаешься из меня маленького дурачка сделать |
отнюдь. Откуда такие выводы?
просто хотел узнать ход работы твоих мыслей по этому поводу.
ну в принципе с тобой согласен.
PS. Что скажешь по предложенному варианту кода?
Спустя 8 минут, 46 секунд (10.07.2011 - 17:07) Gradus написал(а):
Invis1ble, прозрачные намёки

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

Спустя 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; |
Так как так получается, что мой вариант не решает задачу?

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

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

Спустя 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` в итоге останется неизменным

Спустя 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.
Ты же сам пишешь, "вернем старое значение", а нужно противоположное. Вот об этом я и хотел сказать.
Правильно, нужно вернуть противоположный type.
Ты же сам пишешь, "вернем старое значение", а нужно противоположное. Вот об этом я и хотел сказать.
_____________
ДАВАЙ ДЕНЬГИ
R543264623869