update с подзапросом

mulder

Guest
update с подзапросом

Поддерживаются ли в MySQL обновления с подзапросом?, типа
PHP:
UPDATE Поставки
SET	Цена = 0, К_во = 0
WHERE  Пств IN
	(SELECT Пств
		FROM	Поставщики
		WHERE  Город IN ('Паневежис', 'Резекне'));
В мануале я нашел :
MySQL currently only supports sub selects of the form INSERT ... SELECT ... and REPLACE ... SELECT .... You can however use the function IN() in other contexts.
In many cases you can rewrite the query without a sub-select:
PHP:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
Это касается только select или update тоже? Что-то у меня не получается присобачить этот IN, говорит что ошибка в SQL выражении.
 

Demiurg

Guest
update помтавщики set .... where Город IN ('Паневежис', 'Резекне')
 

mulder

Guest
В том-то и дело, что не
update поставщики
а
update поставки
т.е. условие where - из другой таблицы (как в этом примере), а в моем случае - вообще пересечение нескольких таблиц.
 

rifleman

Guest
У меня аналогичная проблема, ответ не сумел найти. Подскажите, как должно написать данный запрос?:


UPDATE table1
SET field1=field1-1
WHERE field2=1
AND field3=id IN (

SELECT id
FROM table2
WHERE field5="BlaBla"

)

версия MySQL 3.23.53
 

Demiurg

Guest
в ручную. выбираешь id из таблицы 2, а потом по одной апдейтишь.

ps твой запрос синтескически не правильный
 

tony2001

TeaM PHPClub
[sql]
SELECT id
FROM table2
WHERE field5="BlaBla"
[/sql]
вынули id, сформировали строку типа "1,2,3,4,5"

[sql]
UPDATE table1
SET field1=field1-1
WHERE field2=1
AND id IN (".$id_string.")
[/sql]
 

rifleman

Guest
Понял, спасибо

С синтаксисом разберусь.
 

si

Administrator
Иногда время от времени полезно перечитывать мануал ;)

Код:
mysql> CREATE TABLE tbl1 (id int, qnt int, price int);                                                                
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE tbl2 (id int, name char(10));                                     
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tbl2 VALUES(1,'city1'), (2,'city2'), (3,'city3'), (4,'city4');                                            
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO tbl1 VALUES(1,1,1), (2,2,2), (3,3,3), (4,4,4);                                 
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT t1.*, t2.*  FROM tbl1 t1, tbl2  t2 WHERE t1.id=t2.id;                                                          
+------+------+-------+------+-------+
| id   | qnt  | price | id   | name  |
+------+------+-------+------+-------+
|    1 |    1 |     1 |    1 | city1 |
|    2 |    2 |     2 |    2 | city2 |
|    3 |    3 |     3 |    3 | city3 |
|    4 |    4 |     4 |    4 | city4 |
+------+------+-------+------+-------+
4 rows in set (0.00 sec)

mysql> UPDATE tbl1,tbl2 SET tbl1.price=0, tbl1.qnt=0 WHERE tbl1.id=tbl2.id AND tbl2.name IN ('city1','city2'); 
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> SELECT t1.*, t2.*  FROM tbl1 t1, tbl2  t2 WHERE t1.id=t2.id;                                           
+------+------+-------+------+-------+
| id   | qnt  | price | id   | name  |
+------+------+-------+------+-------+
|    1 |    0 |     0 |    1 | city1 |
|    2 |    0 |     0 |    2 | city2 |
|    3 |    3 |     3 |    3 | city3 |
|    4 |    4 |     4 |    4 | city4 |
+------+------+-------+------+-------+
4 rows in set (0.00 sec)
P.S. Работать будет на 4.0
 

rifleman

Guest
насчет мануалов согласен))))

но только пока периодически не врубаюсь, что там написано, пока Кто-Нибудь пальцем не ткнет))

опыта мало, вот в чем основная проблема
 
Сверху