这是我的记录。
SELECT * FROM items;
id | show | status | user_id | name | note | note_mod | test | test_mod
----+------+--------+---------+------+--------+----------+-------+----------
1 | t | 1 | | Adam | aaa1 | | test1 |
2 | f | 2 | 1 | Adam | aaa1 | aaa2 | test1 | test_new1
3 | t | 1 | | Tom | blabla | | |
4 | f | 2 | 3 | Tom | blabla | baaa | | ayyyyyy
5 | t | 1 | | Eva | | | |
6 | f | 2 | 5 | Eva | | meow | |
我想改变音符,测试note_mod,test_mod 2和4中的1和3值。
id | show | status | user_id | name | note | note_mod | test | test_mod
----+------+--------+---------+------+--------+----------+-------+----------
1 | t | 1 | | Adam | aaa1 | aaa2 | test1 | test_new1
2 | f | 2 | 1 | Adam | aaa1 | aaa2 | test1 | test_new1
3 | t | 1 | | Tom | blabla | baaa | | ayyyyyy
4 | f | 2 | 3 | Tom | blabla | baaa | | ayyyyyy
5 | t | 1 | | Eva | | meow | |
6 | f | 2 | 5 | Eva | | meow | |
id 2 user_id和id 1相同,id 4 user_id和id 3相同。
我知道只选择新记录,就像这段代码一样。
SELECT new.* FROM items old, items new WHERE old.id = new.user_id AND old.id != new.id;
id | show | status | user_id | name | note | note_mod | test | test_mod
----+------+--------+---------+------+--------+----------+-------+----------
2 | f | 2 | 1 | Adam | aaa1 | aaa2 | test1 | test_new1
4 | f | 2 | 3 | Tom | blabla | baaa | | ayyyyyy
6 | f | 2 | 5 | Eva | | meow | |
但我不知道写UPDATE方法。有人知道吗?
P.S。
感谢您回复GROX13
我需要做的是从其他记录中更改值。
如果我运行此代码
UPDATE items
SET (note_mod, test_mod) = ('new1', 'test_new1') WHERE id = 1;
记录会像你知道的那样改变。
id | show | status | user_id | name | note | note_mod | test | test_mod
----+------+--------+---------+------+--------+----------+-------+----------
1 | t | 1 | | Adam | aaa1 | new1 | test1 | test_new1
但该代码需要更改每个字符串' new1',' new2',' new3' bla bla bla ...
我正在寻找这样的代码。
UPDATE items
SET old(note_mod, test_mod) = new(note_mod, test_mod) WHERE id = 1;
old是卑鄙的id 1' note_mod。 new是卑鄙的id 2' note_mod。 但我不知道如何在UPDATE上定义新旧。有什么想法吗?
我想从user_id匹配它们。 status = 1表示用户注册帐户(example.com/create) 然后user_id,note_mod,test_mod始终为null。 名称是必需的。注意,测试可以为空。
status = 2表示编辑个人资料(example.com/1/edit) 然后user_id自动设置ID($ data - > user_id = $ request - > id)
如果用户更改个人资料,个人资料不会立即更改。 配置文件只能通过我的sql代码更改。
如果用户更改笔记或测试, 设置为note_mod或test_mod,而不是注释或测试。 ($ data - > note_mod = $ request - > note) note,test,note_mod,test_mod可以为空。
答案 0 :(得分:1)
如果您只有四个条目,则可以这样做:
UPDATE items
SET (note_mod, test_mod) = ('new1', 'test_new1') WHERE id = 1;
UPDATE items
SET (note_mod, test_mod) = ('new2', 'test_new2') WHERE id = 3;
对于您的情况,我认为这应该有效,但尚未经过测试:
UPDATE items SET (note_mod) = (note) WHERE note_mod IS NULL AND note IS NOT NULL;
UPDATE items SET (test_mod) = (test) WHERE test_mod IS NULL AND test IS NOT NULL;
我会检查并更新答案。
答案 1 :(得分:0)
当你写下来时,你几乎就在那里:
SELECT new.* FROM items old, items new WHERE old.id = new.user_id AND old.id != new.id;
(将{old,new}替换为{o,n},因为它们是关键字)
UPDATE items o
SET note_mod = n note_mod
, test_mod = n.test_mod
FROM items n
WHERE o.id = n.user_id
AND o.id <> n.id
-- avoid null updates:
-- AND (o.note_mod <> n.note_mod OR o.test_mod <> n.test_mod)
;