ON DUPLICATE 值 CONCAT VALUE 与字符串
ON DUPLICATE value CONCAT VALUE with string
英语不是我的母语,这对我来说很难解释,所以提前为错误的语法道歉 and/or 错别字。
我有一个 mysql table,如图所示
+-----------------------+---------+---------------+---------------+------+
| sus_key | sus_nom | sus_mail | sus_id | etc..+
+-----------------------+---------+---------------+---------------+------+
| int auto_increment | String | String UNIQUE | String | etc..+
+-----------------------+---------+---------------+---------------+------+
我使用这个 table 来保存新闻通讯的订阅者,我使用 "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" mysql_querry 从 php:
在任何表单中插入相同的电子邮件,则用户可以自由更改他们的姓名和其他数据
$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
.
顺便说一句,请注意,您可以在 ON DUPLICATE KEY UPDATE
子句中使用 VALUES(colname)
来引用本应插入该列的值,而不是再次连接字符串。
英语不是我的母语,这对我来说很难解释,所以提前为错误的语法道歉 and/or 错别字。
我有一个 mysql table,如图所示
+-----------------------+---------+---------------+---------------+------+
| sus_key | sus_nom | sus_mail | sus_id | etc..+
+-----------------------+---------+---------------+---------------+------+
| int auto_increment | String | String UNIQUE | String | etc..+
+-----------------------+---------+---------------+---------------+------+
我使用这个 table 来保存新闻通讯的订阅者,我使用 "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" mysql_querry 从 php:
在任何表单中插入相同的电子邮件,则用户可以自由更改他们的姓名和其他数据$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
.
顺便说一句,请注意,您可以在 ON DUPLICATE KEY UPDATE
子句中使用 VALUES(colname)
来引用本应插入该列的值,而不是再次连接字符串。