IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Kак переформировать многотабличный SELECT в подобное для UPDATE (https://www.imho.ws/showthread.php?t=133642)

Viro_man 07.07.2008 18:16

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', чего то крутил и так и сяк, не получилось, а как правильно, не знаю.
То же самое хотелось бы уметь стирать, типа стери те строчки, которые тому же поисковому критерию соответствуют, как указано в примере.
Спасибо!

Hubbitus 08.07.2008 00:35

Не "стери" а "сотри".

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

Удалять думаю в любом случае лучше подзапросом.

Viro_man 08.07.2008 15:11

Похоже mysql в самом деле не поддерживает :(
рыдаю и плачу,..

Hubbitus 08.07.2008 16:52

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

Уж подзапросы-то точно поддерживаются не слишком старыми версиями. Так что всегда можно сделать это через подзапрос, даже если JOIN не поддерживается в UPDATE.

Viro_man 08.07.2008 17:36

Так подзапросы как раз не поддерживает мой сервак, хотя версия 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

тоже не сработал..

Hubbitus 08.07.2008 18:02

Цитата:

Сообщение от Viro_man (Сообщение 1570585)
Так подзапросы как раз не поддерживает мой сервак, хотя версия mysql 5.0.14

Потому и не поддерживает :) С 5.1 вроде бы подзапросы только.

Цитата:

Сообщение от Viro_man (Сообщение 1570585)
А вариант по типу
...
тоже не сработал..

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

Какие ошибки были?

Viro_man 08.07.2008 18:09

Да, вот сейчас ошибку занотировал по типу 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.

Saruman 08.07.2008 18:16

Цитата:

Сообщение от Hubbitus (Сообщение 1570596)
Цитата:
Цитата:

Сообщение от Viro_man
Так подзапросы как раз не поддерживает мой сервак, хотя версия mysql 5.0.14

Потому и не поддерживает С 5.1 вроде бы подзапросы только.

"позапросами" вы что называете? subqueries, типа вложенных selectов? С 4.1 они поддерживаются, не надо дезинформации.

Viro_man 08.07.2008 18:24

Ребята, кажется наконец то получилось :) только чуть по другому и не знаю, сделало ли оно то, что мне нужно было, ух, аж страшно стало :)
В общем так вышло
$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)
или я не прав?

Saruman 08.07.2008 19:13

не равнозначно, но в твоём случае, полагаю, подойдёт

Viro_man 08.07.2008 20:33

Если не равнозначно, то это может в моём случае быть фатальным. Саруман, ты мог бы привести примеры, где это неравнозначно, и другие получаются результаты, просто до меня пока не дошло, где кроется разница..

Saruman 08.07.2008 20:56

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

Суть же разницы в том, что старый вариант даёт взаимно однозначное сопоставление рядов обоих таблиц, субселект же в твоей записи просто выбирает ряды из одной таблицы, не ставя им в соответствие ряды второй. В определённых выборках это может быть критично.

Viro_man 08.07.2008 23:39

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

добавлено через 39 минут
Странно, но даже при чтении по субзапросом выходит то же самое количество и в том же порядке, как и при чтении в прямом обозначении, значит всё же равнозначно!?

Hubbitus 09.07.2008 11:04

Цитата:

Сообщение от Viro_man (Сообщение 1570597)
Ошибка You can't specify target table 'tbldaten' for update in FROM clause.

Ну так не указывайте алиас для таблицы в FROM-выражении!!

Цитата:

Сообщение от Saruman (Сообщение 1570598)
"позапросами" вы что называете? subqueries, типа вложенных selectов? С 4.1 они поддерживаются, не надо дезинформации.

Согласен. Посыпаю голову пеплом. С 4.1 поддерживается http://dev.mysql.com/tech-resources/...es_part_1.html

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

Цитата:

Сообщение от Viro_man (Сообщение 1570599)
Ребята, кажется наконец то получилось только чуть по другому и не знаю, сделало ли оно то, что мне нужно было, ух, аж страшно стало

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

Цитата:

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

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

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

Viro_man 09.07.2008 15:02

Цитата:

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

Цитата:

Только не увлекайтесь особо, и главное бездумно - объединения в большинстве случаев намного более производительны.
Если бы была возможность сделать этот запрос как то иначе, я бы не промедлил ни секунды, однако увы, а на извраты я не особо падок.

Hubbitus 09.07.2008 16:52

Цитата:

Сообщение от Viro_man (Сообщение 1570877)
Если бы была возможность сделать этот запрос как то иначе

Так есть же!
Неужели не работает пример из МАНа??
Скажем вот этот:
Код:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;



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

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