Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2008
Помог: 0 раз(а)
Помогите, пожалуйста составить правильный UPDATE.
Нужно, чтобы поле ONTOP стало равно '1' у элемента с ID=36 и у всех элементов таблицы с таким же полем DOCNAME. smile.gif
Вроде не очень сложно, но не получается...
----- Не пользуйтесь денверами, делайте сами связки)))))
Champion
Отправлено: 28 Августа, 2008 - 15:21:51
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
WHERE `ID` = '36' OR `DOCNAME` = (SELECT `DOCNAME` FROM `DOCUMENTS` WHERE `ID` = '36')
А какой смысл? Часть запроса после OR всегда будет истина. кажется. И неплохо бы select first 1... или docname in (select...
pifon1989
Отправлено: 28 Августа, 2008 - 15:36:24
Частый гость
Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008
Помог: 0 раз(а)
Champion пишет:
И неплохо бы select first 1... или docname in (select...
Интересно. Пример!
----- Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
Champion
Отправлено: 02 Сентября, 2008 - 12:01:08
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Цитата:
Интересно. Пример!
UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where таким же полем DOCNAME )
UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where таким же полем DOCNAME )
только я не совсем понял фразу "таким же полем DOCNAME". Таким же как что? (Добавление)
ААА, понял! либо id 36, либо dockname такой же, как один из тех, что с id 36?
Тогда вот:
UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` = (SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where id = 36)
UPDATE `DOCUMENTS` SET `ONTOP` = 1 WHERE `ID` = '36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where id = 36 )
По поводу того, что часть запроса всегда true - вроде я ошибся
pifon1989
Отправлено: 02 Сентября, 2008 - 13:20:24
Частый гость
Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008
UPDATE `DOCUMENTS` SET `ONTOP` =1 WHERE `ID` ='36' OR `DOCNAME` =(SELECT FIRST 1 `DOCNAME` FROM `DOCUMENTS` where id =36)
UPDATE `DOCUMENTS` SET `ONTOP` =1 WHERE `ID` ='36' OR `DOCNAME` in (SELECT `DOCNAME` FROM `DOCUMENTS` where id = 36 )
По поводу того, что часть запроса всегда true- вроде я ошибся
Любопытный пример, надо будет взять на заметку. SQL вообще то язык довольно простой, пока дело до триггеров не доходит
----- Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
EuGen
Отправлено: 02 Сентября, 2008 - 17:45:47
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Нельзя использовать одну и ту же таблицу в запросе, который по ней делает одновременно и выборку и обновление. Соотвественно этого приведенные выше запросы завершатся ошибкой.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
pifon1989
Отправлено: 02 Сентября, 2008 - 18:24:01
Частый гость
Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008
Помог: 0 раз(а)
Тьфу. Никак не пойму, что за дикий запрос и в чём суть, хоть убейте.
Итак.
1. Есть таблица с именем DOCUMENTS;
2. В ней есть ячейка под названием ONTOP;
3. В каждой строке есть ID-указатель, на который мы и опираемся;
4. Так вот в той строке, где ID равен 36, мы устанавливаем новое значение ONTOP;
5. Но с момента OR начинается полная тупня, как не назови - одно:
а.) Мы говорим базе: в строк(е/ах), где ID равен 36 или некое поле, именуемое DOCNAME, - что оно? 0.о
Оно находится в таблице, в строке, где ID равно 36??? Как это может быть?
Нет, вдумайтесь, - мы меняем значение поля ONTOP там, где ID равно 36 или есть поле DOCNAME, у которого ID в строке равно 36. Во-первых, вопрос: нафига это надо? Если самого ID нет, второй вариант неверен, поскольку уже по определению поля DOCNAME с ID равным 36 быть не может.
Иными словами, мы говорим: если 2+3 = 5 или 3+2 = 5, то.
б.) Мы посылаем офигенски умный запрос: не "или существует DOCNAME, в строке у которого ID равен 36", как скорее всего было задумано, а "существует DOCNAME, в (извлеки DOCNAME из DOCUMENTS, где ID равно 36)". Т.е. мы ищем DOCNAME в DOCNAME, в строке которого ID = 36.
в.) Может быть, конечно, всем всё в этом запросе понятно, но мне в нём ничего не понятно. В нём ни смысла, ни простейшей логики запроса.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.