ON DUPLICATE使用字符串值CONCAT VALUE

时间:2015-09-24 22:42:57

标签: php mysql concat

英语不是我的母语,我很难解释为语法错误和/或错别字提前道歉。

我有一个mysql表,因为它显示

+-----------------------+---------+---------------+---------------+------+
|        sus_key        | sus_nom |   sus_mail    |    sus_id     | etc..+
+-----------------------+---------+---------------+---------------+------+
|   int auto_increment  | String  | String UNIQUE |    String     | etc..+
+-----------------------+---------+---------------+---------------+------+

我使用此表来保存简报的订阅者,并使用" sus_id"识别用户订阅的表单,例如:

user1 subscribe from form of page1 the "sus_id" will be "form1"
user2 subsribe from form of page2 the "sus_id" will be "form2"

如果用户使用" ON DUPLICATE KEY UPDATE"在任何表格上插入相同的电子邮件,他们可以自由更改他们的姓名和其他数据。来自php的mysql_querry:

$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "INSERT INTO correos (sus_nom, sus_mail, sus_id, sus_tel)    VALUES ('".$name ."', '".$email ."', 'form#', '".$tel ."') ON DUPLICATE KEY UPDATE sus_nom = ('".$name."'), sus_tel = ('".$tel."'), sus_id = ('form#');";
$conn->query($sql);

我想要的是,如果现有用户使用CONCAT从另一个表单更新,以混合用户订阅的现有id_fom的值与用户实际上怀疑的id_form:

user1 suscribe in form 1 -> sus_id = "form1"
user1 update in form 2 -> sus_id = "form1form2"

抱歉,如果结果是2个问题,但是: 我如何使用CONCAT" ON DUPLICATE KEY UPDATE" statment? 考虑用户可能两次订阅相同的表单,如何检查值sus_id是否已具有当前的form_id字符串,以便值不重复? (如果sus_id有" form1form2"并且form1的用户更新什么都不做)

1 个答案:

答案 0 :(得分:1)

将多个值放在一个列中通常是一个坏主意,它会使搜索值变得昂贵,因为它们无法编入索引,正如您可以从此问题中看到的那样,它会更新列难。但如果你必须这样做:

ON DUPLICATE KEY UPDATE 
    sus_nom = VALUES(sus_num), 
    sus_tel = VALUES(sus_tel), 
    sus_id = IF(LOCATE(sus_id, VALUES(sus_id)), sus_id, CONCAT(sus_id, VALUES(sus_id)))

LOCATE测试sus_id的新值是否已在sus_id列中。如果是,则将sus_id设置回自身,否则它会连接新的sus_id

BTW,请注意您可以在VALUES(colname)子句中使用ON DUPLICATE KEY UPDATE来引用已插入该列的值,而不是再次连接该字符串。