imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 07.07.2008, 18:16     # 1
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Kак переформировать многотабличный SELECT в подобное для UPDATE

Тут у меня возник вопрос, имею следующее...
$sql="SELECT tad.* from tabledata tad, tableback back where tad.settedID=back.settedID and back.Project=303 and tad.field1='on'";
То есть поставляются данные, которые критериям этим соответствуют,
твперь мне надо по этим же критериям поиска в таблице tabledata изменить значения field1='' und field2='on', чего то крутил и так и сяк, не получилось, а как правильно, не знаю.
То же самое хотелось бы уметь стирать, типа стери те строчки, которые тому же поисковому критерию соответствуют, как указано в примере.
Спасибо!
Viro_man вне форума  
Старый 08.07.2008, 00:35     # 2
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Не "стери" а "сотри".

На счет запросов, на сколько я помню (все больше с MSSQL работаю последнее время, приходится), обновлять за раз можно только одну таблицу, но если обновляемые поля из одной таблицы, то в условиях выборки вполне можно применять JOIN'ы.
http://howto.thibeault.cc/2008/02/join-sql-update.html
Пишут что и MySQL поддерживает вроде. Ну в крайнем случае всегда остается вариант с подзапросом.

Удалять думаю в любом случае лучше подзапросом.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 08.07.2008, 15:11     # 3
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Похоже mysql в самом деле не поддерживает
рыдаю и плачу,..
Viro_man вне форума  
Старый 08.07.2008, 16:52     # 4
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Не поддерживает что именно?? И почему "на самом деле", если я написал что "пишут что поддерживает"?

Уж подзапросы-то точно поддерживаются не слишком старыми версиями. Так что всегда можно сделать это через подзапрос, даже если JOIN не поддерживается в UPDATE.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 08.07.2008, 17:36     # 5
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Так подзапросы как раз не поддерживает мой сервак, хотя версия mysql 5.0.14, повлиять на это не могу. А вариант по типу
update i
set i.feed_id = c.feed_id
from invc_item i, calls c
where i.feed_id = 0
and c.invc_item_id = i.invc_item_id
and c.feed_id > 0

тоже не сработал..
Viro_man вне форума  
Старый 08.07.2008, 18:02     # 6
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от Viro_man Посмотреть сообщение
Так подзапросы как раз не поддерживает мой сервак, хотя версия mysql 5.0.14
Потому и не поддерживает С 5.1 вроде бы подзапросы только.

Цитата:
Сообщение от Viro_man Посмотреть сообщение
А вариант по типу
...
тоже не сработал..
А вот это странно, Multiple-table syntax UPDATE уже поддерживаться должен, судя по офф-документации - http://dev.mysql.com/doc/refman/5.0/en/update.html

Какие ошибки были?
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 08.07.2008, 18:09     # 7
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Да, вот сейчас ошибку занотировал по типу multiple table

$sql="update tbldaten set tbldaten.field1='on'
where tbldaten.settedID in (SELECT tad.settedID from tbltaetigkeitsdaten tad, tblback back where tad.settedID=back.settedID and back.Project_Nr=300)";

Ошибка You can't specify target table 'tbldaten' for update in FROM clause.
Viro_man вне форума  
Старый 08.07.2008, 18:16     # 8
Saruman
::VIP::
 
Аватар для Saruman
 
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285

Saruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman Гуру
Цитата:
Сообщение от Hubbitus Посмотреть сообщение
Цитата:
Цитата:
Сообщение от Viro_man
Так подзапросы как раз не поддерживает мой сервак, хотя версия mysql 5.0.14
Потому и не поддерживает С 5.1 вроде бы подзапросы только.
"позапросами" вы что называете? subqueries, типа вложенных selectов? С 4.1 они поддерживаются, не надо дезинформации.
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti

Последний раз редактировалось Saruman; 08.07.2008 в 18:20.
Saruman вне форума  
Старый 08.07.2008, 18:24     # 9
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Ребята, кажется наконец то получилось только чуть по другому и не знаю, сделало ли оно то, что мне нужно было, ух, аж страшно стало
В общем так вышло
$sql="update tbldaten set field1='on'
where settedID in (SELECT settedID from tblback where Project_Nr=300)";
Если не ошибаюсь, этот запрос репрезентирует моё желание, ведь по сути tbldaten.settedID=tblback.settedID равнозначно settedID in(SELECT settedID from tblback)
или я не прав?
Viro_man вне форума  
Старый 08.07.2008, 19:13     # 10
Saruman
::VIP::
 
Аватар для Saruman
 
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285

Saruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman Гуру
не равнозначно, но в твоём случае, полагаю, подойдёт
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti
Saruman вне форума  
Старый 08.07.2008, 20:33     # 11
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Если не равнозначно, то это может в моём случае быть фатальным. Саруман, ты мог бы привести примеры, где это неравнозначно, и другие получаются результаты, просто до меня пока не дошло, где кроется разница..
Viro_man вне форума  
Старый 08.07.2008, 20:56     # 12
Saruman
::VIP::
 
Аватар для Saruman
 
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285

Saruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman Гуру
в данном update-запросе - равнозначно.

Суть же разницы в том, что старый вариант даёт взаимно однозначное сопоставление рядов обоих таблиц, субселект же в твоей записи просто выбирает ряды из одной таблицы, не ставя им в соответствие ряды второй. В определённых выборках это может быть критично.
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti
Saruman вне форума  
Старый 08.07.2008, 23:39     # 13
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Ты имеешь ввиду при выбирании с последующим сортированием? Просто без прямого примера тяжело понять, где бы это критично разнилось.
Попробую зачитать с субселектом..

добавлено через 39 минут
Странно, но даже при чтении по субзапросом выходит то же самое количество и в том же порядке, как и при чтении в прямом обозначении, значит всё же равнозначно!?
Viro_man вне форума  
Старый 09.07.2008, 11:04     # 14
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от Viro_man Посмотреть сообщение
Ошибка You can't specify target table 'tbldaten' for update in FROM clause.
Ну так не указывайте алиас для таблицы в FROM-выражении!!

Цитата:
Сообщение от Saruman Посмотреть сообщение
"позапросами" вы что называете? subqueries, типа вложенных selectов? С 4.1 они поддерживаются, не надо дезинформации.
Согласен. Посыпаю голову пеплом. С 4.1 поддерживается http://dev.mysql.com/tech-resources/...es_part_1.html

Viro_man, так тем более тогда с ними не должно быть проблем уж точно.

Цитата:
Сообщение от Viro_man Посмотреть сообщение
Ребята, кажется наконец то получилось только чуть по другому и не знаю, сделало ли оно то, что мне нужно было, ух, аж страшно стало
Хм, так сразу же говорил что если не получается с JOINом, используйте подзапросы. Именно подобное и имелось ввиду (еще можно использовать EXISTS выражение, на больших объемах данных это может дать выигрыш по производительности)

Цитата:
Сообщение от Viro_man Посмотреть сообщение
Ты имеешь ввиду при выбирании с последующим сортированием? Просто без прямого примера тяжело понять, где бы это критично разнилось.
Я полагаю речь идет, например о том, что таким способом во внешнем SELECT могут быть выбраны поля только одной таблицы, никак не двух и более. И если объединение со второй таблицей было только для формирования условий отбора кортежей, то тогда запрос можно в большинстве случаев (всех?) переписать из JOIN'ов в subqueries.

Только не увлекайтесь особо, и главное бездумно - объединения в большинстве случаев намного более производительны.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 09.07.2008, 15:02     # 15
Viro_man
Banned
 
Аватар для Viro_man
 
Регистрация: 11.06.2008
Сообщения: 57

Viro_man Путь к славе только начался
Цитата:
Ну так не указывайте алиас для таблицы в FROM-выражении!!
Дык, так сам уже ещё вчера догадался и сделал как надо.

Цитата:
Только не увлекайтесь особо, и главное бездумно - объединения в большинстве случаев намного более производительны.
Если бы была возможность сделать этот запрос как то иначе, я бы не промедлил ни секунды, однако увы, а на извраты я не особо падок.
Viro_man вне форума  
Старый 09.07.2008, 16:52     # 16
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от Viro_man Посмотреть сообщение
Если бы была возможность сделать этот запрос как то иначе
Так есть же!
Неужели не работает пример из МАНа??
Скажем вот этот:
Код:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 03:36.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.