Английский не является моим родным языком, и мне трудно объяснить это заранее, извиняюсь за плохую грамматику и / или опечатки.
У меня есть таблица 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» 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 вопроса, но:
Как я могу использовать CONCAT для записи «ON DUPLICATE KEY UPDATE»?
Учитывая, что пользователь может подписаться на одну и ту же форму дважды, как проверить, имеет ли значение 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(sus_id, VALUES(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
предложение, чтобы ссылаться на значения, которые были бы вставлены в этот столбец, а не конкатенировать строку снова.
Других решений пока нет …