代码之家  ›  专栏  ›  技术社区  ›  Hex

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

  •  0
  • Hex  · 技术社区  · 6 年前

    你看我有这样的疑问:

     $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表中不存在这些值(访问者用户名、电子邮件),我们会插入这些值,它工作得非常好,速度也很快,但一个好的解决方案并不总是带来彩虹。

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

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

    由于我无法确定哪一个存在,我希望用户名或电子邮件地址有具体的案例返回错误。

    我应该拆分查询(一次选择,然后插入),还是有其他我在网上找不到的方法可以在同一个查询中拆分查询?

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

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Aleksandar Rakić    6 年前

    我会创建两个查询或一个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`;