如何根据值更改一列或另一列?

时间:2016-10-31 14:41:49

标签: mysql node.js

我正在使用node.js和mysql为学校制作一个Tinder克隆,并且有一个涉及喜欢和不喜欢的人的系统。遗憾的是,我将很多数据库建立在用户选择的用户名上,现在我遇到了用户想要更改用户名的问题,我需要更改数据库中的所有实例。 (我知道我应该使用用户ID代替,但此时由于项目即将完成而无法改变,而且只是为了学校的学习目的。)我根据用户名所在的位置更改一列或另一列中的数据时遇到问题。我的数据库表示例如:

Liker    | Liked
-------------------
jennifer | matt
jennifer | colin
jennifer | justin
joe1     | sarah
joe1     | tammy
joe1     | lindsay
celine6  | joe1
celine6  | curtis

因此,例如,如果joe1​​已经决定他现在想要使用用户名buffdude27,我尝试在节点中使用以下查询,使用mysql中间件更改表中的所有名称实例:

var change = ['buffdude27', 'buffdude27', 'joe1', 'joe1'];
connection.query('UPDATE likes SET liker = ? OR liked = ? WHERE liker = ? OR liked = ?', change, function(err, results){

...the actions I take after the query happens...
    });

我遇到的问题是,它会找到joe1的所有实例,并用0替换他的用户名。我做错了什么,这样做的正确方法是什么?提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

运行两个简单的查询:

UPDATE likes SET liker = 'buffdude27' WHERE linker = 'joe1';
UPDATE likes SET liked = 'buffdude27' WHERE linked = 'joe1';

或者更复杂的一个:

UPDATE likes 
SET liker = CASE WHEN linker = 'joe1' THEN 'buffdude27' ELSE linker END,
    liked = CASE WHEN linked = 'joe1' THEN 'buffdude27' ELSE linked END
WHERE 'joe1' IN (liker, liked)

更好的方法是拥有一个包含users列和user_id列的name表格。并在likes表(liker_user_idliked_user_id)中存储引用(外键)。

如果用户决定更改其名称,则只需更新name表中的users列。引用user_id的所有其他表格都需要更改。