#php #sql #sql-update #inner-join
Вопрос:
У меня есть следующая команда SQL. Здесь есть два стола,
таблица с именем rbhl_link nodes выглядит следующим образом
Id, Node1, Node2 1 , 6 , 7
таблица с именем rbhl_nodelist содержит кучу данных, включая идентификатор и r, мне нужно изменить значение r
Id, R 6, 15 7, 15
Команда select работает и отображает мне приведенный выше результат. Когда я пытаюсь поменять его с помощью обновления, это не работает.
UPDATE rbhl_nodelist SET nl.r = nl.r - 3 FROM rbhl_nodelist nl INNER JOIN rbhl_linkednodes ln ON ln.node1 = nl.id or ln.node2 = nl.id WHERE ln.id = 1; SELECT nl.r FROM rbhl_nodelist nl INNER JOIN rbhl_linkednodes ln ON ln.node1 = nl.id or ln.node2 = nl.id WHERE ln.id = 1;
Цель состоит в том, чтобы уменьшить оба значения сразу на 3 с помощью одной команды.
Ответ №1:
У тебя почти получилось.
Создать тестовый случай:
CREATE TABLE rbhl_linkednodes ( id int auto_increment primary key, node1 varchar(255), node2 varchar(255) ); CREATE TABLE rbhl_nodelist ( id int, r int ); insert into rbhl_linkednodes set node1 = 6, node2 = 7; insert into rbhl_linkednodes set node1 = 16, node2 = 17; insert into rbhl_linkednodes set node1 = 26, node2 = 27; insert into rbhl_nodelist set id = 6, r = 15; insert into rbhl_nodelist set id = 7, r = 15; insert into rbhl_nodelist set id = 16, r = 15; insert into rbhl_nodelist set id = 17, r = 15; insert into rbhl_nodelist set id = 26, r = 15; insert into rbhl_nodelist set id = 27, r = 15; select * from rbhl_linkednodes; ---- ------- ------- | id | node1 | node2 | ---- ------- ------- | 1 | 6 | 7 | | 2 | 16 | 17 | | 3 | 26 | 27 | ---- ------- ------- select * from rbhl_nodelist; ------ ------ | id | r | ------ ------ | 6 | 15 | | 7 | 15 | | 16 | 15 | | 17 | 15 | | 26 | 15 | | 27 | 15 | ------ ------
Запрос на обновление:
UPDATE rbhl_nodelist nl INNER JOIN rbhl_linkednodes ln ON ln.node1 = nl.id or ln.node2 = nl.id SET nl.r = nl.r - 3 WHERE ln.id = 1;
Результаты в
select * from rbhl_linkednodes; ---- ------- ------- | id | node1 | node2 | ---- ------- ------- | 1 | 6 | 7 | | 2 | 16 | 17 | | 3 | 26 | 27 | ---- ------- ------- select * from rbhl_nodelist; ------ ------ | id | r | ------ ------ | 6 | 12 | lt;--- OK | 7 | 12 | lt;--- OK | 16 | 15 | | 17 | 15 | | 26 | 15 | | 27 | 15 | ------ ------
Итак, порядок таков:
Обновить
присоединяйтесь
установите, где
=)
Комментарии:
1. Спасибо!!! Я сходил с ума, пытаясь понять это. Да благословит Господь stackoverflow и людей, которые оказывают свою помощь!
Ответ №2:
Попробуй Not Exists
update rbhl_nodelist set r = r - 3 from rbhl_nodelist t1 where exists ( select 1 from rbhl_linkednodes t2 where t2.ID = 1 and t2.node1 = t1.id or t2.node2 = t1.id )