【问题标题】:Updating a field and selecting multiple fields where a single condition is true? MySQL更新一个字段并选择单个条件为真的多个字段? MySQL
【发布时间】:2011-12-26 11:30:34
【问题描述】:

在 MySQL 中是否可以在单个查询中更新单个字段并选择多个不同的字段,其中单个条件为真?我不确定正确的 SQL 应该是什么,但如果可能的话,我当然想合并这两个示例查询。

示例

更新查询:

UPDATE `users` SET `activation`='$activationCode' WHERE `email`='$anEmail'

还有一个选择查询:

SELECT `password`,`salt`,`fname`,`email` FROM `users` WHERE `email`='$anEmail'

在这里看到重复的条件?当我可以在一个条件下一次完成所有操作时,肯定没有必要用重复的条件查询 MySQL 数据库两次吗?

值得注意的是,$anEmail$activationCode 将是以前在 PHP 中定义的变量(前者在两个查询中也完全相同)。干杯。

【问题讨论】:

  • PHP 变量名称表明您将值直接插入到语句中。不要那样做。使用准备好的语句(PDOmysqli 支持)将数据与语句分开。在众多好处中,这可以通过值防止SQL injection
  • @outis 好的,你能给我任何关于在 mysqli 中使用准备好的语句的教程的链接吗?我试过看,但大多数都无法解释它们是如何工作和运行的。
  • 我知道 PDO 的教程,但没有 mysqli 的教程。网络搜索会给您比 I 更好的结果。有关概念性概述,请阅读 Parallels Between Prepared Statements and Functions。准备好的陈述并不多。你不需要知道它们是如何工作的,你只需要知道如何使用它们。
  • @outis,谢谢 - 我本来打算使用 MySQLi,但后来我被说服了,现在将尝试 PDO。再次感谢。
  • PDO 更好用,我发现。一方面,PDOStatement 实现了Traversable,这意味着您可以使用foreach 循环遍历结果。

标签: php mysql sql


【解决方案1】:

你必须写一个stored procedure

delimiter ;;
CREATE PROCEDURE UpdateAndSelect (mEmail Varchar(50), mactivationCode Varchar(20))
 BEGIN
   START TRANSACTION;
   UPDATE `users` SET `activation`=mactivationCode WHERE `email`=mEmail;
   SELECT `password`,`salt`,`fname`,`email` FROM `users` WHERE `email`=mEmail;
   COMMIT;
 END;;
delimiter ;

调用过程:

CALL UpdateAndSelect(:email, :activation)

【讨论】:

  • 这就是答案。删除我的答案。
【解决方案2】:

如果您只想跳过重复的 where 子句,请查看此帖子(第一个答案)

SQL Update Multiple Fields FROM via a SELECT Statement

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 2013-08-04
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多