Как вернуть в запросе INSERT-SELECT, который существовал в условии WHERE

Вы видите, у меня есть этот запрос:

 $sql = "INSERT INTO visitor( visitor_username, email, PASSWORD )
SELECT * FROM ( SELECT '$username', '$email','$password')
AS tmp WHERE NOT EXISTS
(SELECT admin.admin_username, admin.email FROM admin AS admin
WHERE admin.admin_username = '$username' OR admin.email = '$email'
UNION SELECT staff.staff_username, staff.email FROM staff
AS staff WHERE staff.staff_username = '$username' OR
staff.email = '$email' ) LIMIT 1";

в основном, если значения (visitor_username, email) не существует в таблице admin / staff, мы вставляем значения, они работают довольно быстро и быстро, но хорошее решение не всегда приносит радугу.

если мы не смогли вставить какие-либо значения в таблицу, я возвращаю это сообщение об ошибке

echo "User already exists. Please choose a different email address or username.";

Поскольку я не могу определить, какой из них существовал, я хотел бы, чтобы в случае имени пользователя или адреса электронной почты была возвращена конкретная ошибка возврата.

Должен ли я разделить запрос (один выбор, затем вставить) или есть другой способ, которым я не могу найти в Интернете, чтобы сделать это в том же запросе?

Моя цель — вернуть конкретное сообщение об ошибке с помощью этого запроса, например:

«Ошибка: имя пользователя уже существует» или
«Ошибка: электронная почта уже существует.»

Спасибо за проверку и пытаясь помочь мне заранее!

0

Решение

Я бы создал два запроса или одну функцию MySQL, которая будет возвращать некоторый ответ. В случае, если вы решите использовать функцию MySQL, вот как это сделать (настройте следующий запрос для вашей цели):

delimiter $$;
create function `function_name`() returns integer deterministic
begin
select count(*) into a from `table` where 1 = 1;
if a > 0 then
insert into `table`(`col1`, `col2`) values('val1', 'val2');
select if(last_insert_id() > 0, 'response_200', 'response_500') into b from dual;
return b;
else
return 'response_501';
end if;
end $$
delimiter ;

Эту функцию вы будете вызывать как запрос ниже, и вы получите только одну запись с одним из вышеприведенных выходных данных:

select `function_name`() as `response`;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]