【问题标题】:How to return in a INSERT-SELECT query which conditional in WHERE statement existed如何在 WHERE 语句中存在条件的 INSERT-SELECT 查询中返回
【发布时间】:2019-05-01 12:15:25
【问题描述】:

你看我有这个查询:

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

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

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

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

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

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

【问题讨论】:

  • 我会创建两个查询或一个 MySQL 函数来返回一些响应。
  • 请显示更完整的 PHP 代码块(不是行 sn-ps),因为这似乎是用户定义的错误消息。我们需要看看条件逻辑。

标签: php mysql insert-select


【解决方案1】:

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

【讨论】:

  • 这与我在查询中所做的类似,它返回 1 条记录,但如果“用户”或“电子邮件”存在,我无法定义哪个记录存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2014-06-14
  • 2023-03-15
相关资源
最近更新 更多