英语不是我的母语,这对我来说很难解释,因为对于语法和/或拼写错误,请事先道歉。

我有一个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"


如果用户使用php中的“ ON DUPLICATE KEY UPDATE” 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个问题,但:
如何在“ ON DUPLICATE KEY UPDATE”语句上使用CONCAT?
考虑到用户可能两次订阅相同的表单,如何检查值sus_id是否已经具有当前的form_id字符串,因此值不会重复? (如果sus_id具有“ form1form2”,并且用户从form1更新不执行任何操作)

最佳答案

将多个值放在单个列中通常是一个坏主意,它会使值搜索变得昂贵,因为它们无法建立索引,并且如您从该问题中所看到的,这使更新列变得困难。但是,如果您必须这样做:

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


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

顺便说一句,请注意,您可以在VALUES(colname)子句中使用ON DUPLICATE KEY UPDATE来引用将被插入到该列中的值,而不是再次串联该字符串。

关于php - 带有字符串的ON DUPLICATE值CONCAT VALUE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32772123/

10-11 02:07