![]() |
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', чего то крутил и так и сяк, не получилось, а как правильно, не знаю. То же самое хотелось бы уметь стирать, типа стери те строчки, которые тому же поисковому критерию соответствуют, как указано в примере. Спасибо! |
Не "стери" а "сотри".
На счет запросов, на сколько я помню (все больше с MSSQL работаю последнее время, приходится), обновлять за раз можно только одну таблицу, но если обновляемые поля из одной таблицы, то в условиях выборки вполне можно применять JOIN'ы. http://howto.thibeault.cc/2008/02/join-sql-update.html Пишут что и MySQL поддерживает вроде. Ну в крайнем случае всегда остается вариант с подзапросом. Удалять думаю в любом случае лучше подзапросом. |
Похоже mysql в самом деле не поддерживает :(
рыдаю и плачу,.. |
Не поддерживает что именно?? И почему "на самом деле", если я написал что "пишут что поддерживает"?
Уж подзапросы-то точно поддерживаются не слишком старыми версиями. Так что всегда можно сделать это через подзапрос, даже если JOIN не поддерживается в UPDATE. |
Так подзапросы как раз не поддерживает мой сервак, хотя версия 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 тоже не сработал.. |
Цитата:
Цитата:
Какие ошибки были? |
Да, вот сейчас ошибку занотировал по типу 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. |
Цитата:
|
Ребята, кажется наконец то получилось :) только чуть по другому и не знаю, сделало ли оно то, что мне нужно было, ух, аж страшно стало :)
В общем так вышло $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) или я не прав? |
не равнозначно, но в твоём случае, полагаю, подойдёт
|
Если не равнозначно, то это может в моём случае быть фатальным. Саруман, ты мог бы привести примеры, где это неравнозначно, и другие получаются результаты, просто до меня пока не дошло, где кроется разница..
|
в данном update-запросе - равнозначно.
Суть же разницы в том, что старый вариант даёт взаимно однозначное сопоставление рядов обоих таблиц, субселект же в твоей записи просто выбирает ряды из одной таблицы, не ставя им в соответствие ряды второй. В определённых выборках это может быть критично. |
Ты имеешь ввиду при выбирании с последующим сортированием? Просто без прямого примера тяжело понять, где бы это критично разнилось.
Попробую зачитать с субселектом.. добавлено через 39 минут Странно, но даже при чтении по субзапросом выходит то же самое количество и в том же порядке, как и при чтении в прямом обозначении, значит всё же равнозначно!? |
Цитата:
Цитата:
Viro_man, так тем более тогда с ними не должно быть проблем уж точно. Цитата:
Цитата:
Только не увлекайтесь особо, и главное бездумно - объединения в большинстве случаев намного более производительны. |
Цитата:
Цитата:
|
Цитата:
Неужели не работает пример из МАНа?? Скажем вот этот: Код:
UPDATE items,month SET items.price=month.price |
| Часовой пояс GMT +4, время: 01:40. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.