如何在INSERT-SELECT查询中返回WHERE语句中存在的条件

时间:2018-11-29 12:19:38

标签: php mysql insert-select

您看到我有此查询:

 $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";

基本上,如果admin / staff表上不存在值(visitor_username,email),则我们插入这些值,它的效果非常好而且很快,但是好的解决方案并不总是会带来麻烦。

如果我们无法在表中插入任何值,则会返回此错误消息

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

由于我无法确定存在哪一个,因此我想针对用户名或电子邮件地址返回特定的大小写错误。

我应该拆分查询(一次选择,然后插入)还是在同一查询中找不到其他在线方式?

我的目标是通过此查询返回特定的错误消息,例如:

“错误:用户名已经存在”  要么 “错误:电子邮件已经存在。”

感谢您检查并尝试帮助我!

1 个答案:

答案 0 :(得分: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`;