【问题标题】:Is there a way of combining these 2 MySQL statements?有没有办法组合这两个 MySQL 语句?
【发布时间】:2011-10-14 15:21:06
【问题描述】:

我想运行一个查询,将 qa_votes 字段加 1,然后检索该字段的结果值,以便在前端显示它。

所以代码草案是

    $this->db->query("
    UPDATE  qa
    SET     qa_votes = qa_votes +1
    WHERE   qa_id = $question_id;
    ");

紧随其后

    $query = $this->db->query("
    SELECT  qa_id, qa_votes
    FROM    qa
    WHERE   qa_id = $question_id;
    ");

有没有办法将这两个组合成一个查询?

【问题讨论】:

  • 可以在数据库中使用存储函数吗?我想这取决于语言/数据库类型。
  • 嗯,不,它们是两个独立的命令。您是否在问是否可以仅使用客户端库中的一个命令来执行此操作?答案很可能是肯定的。
  • 好吧,我想知道是否有合法的语法允许更新后选择相同的字段,以便我可以访问更新后的值

标签: mysql sql select sql-update


【解决方案1】:

简答:没有。

长答案:不是使用开箱即用的命令。 UPDATE 命令不提供。但是,您可以编写一个 Stored Procedure 来更新然后返回结果。

【讨论】:

  • 有道理,只是想确保两者都可以在单个数据库命中中完成
  • 顺便说一句,您尝试过@Dems 的回答吗?我不确定这是否有效,但如果有效,它看起来很有希望。
【解决方案2】:

是的。你可以使用LAST_INSERT_ID

如果 expr 作为 LAST_INSERT_ID() 的参数,则该参数的值由函数返回,并作为 LAST_INSERT_ID() 返回的下一个值被记住

所以你可以这样做:

$this->db->query("
UPDATE  qa
SET     qa_votes = LAST_INSERT_ID(qa_votes +1)
WHERE   qa_id = $question_id;
");

紧随其后

$query = $this->db->query("SELECT LAST_INSERT_ID()");

您使用的 MySQL API 可能具有检索最后一个的快捷方式(例如 PHP 中的 mysql_insert_id())。

【讨论】:

  • 但据我所知,您仍然需要查询才能获取 LAST_INSERT_ID() 的值。你能举个例子吗?
  • 我明白 - 所以没有办法做一个查询来获得两个动作
  • @sagi:也许是SET qa_votes = LAST_INSERT_ID(qa_votes +1)
  • 第二个查询并不是真正的另一个查询,它只是检索存储在 MySQL 会话中的一个变量,因此立即返回。相当于在向数据库中插入一条新记录后,检索一个自动递增的 ID 值。
  • torr:如果你使用mysql_insert_id(),那么我认为它真的只是一个单一的查询,没有第二次往返数据库。
【解决方案3】:

只需将它们组合成一个 SQL 字符串?

 $query = $this->db->query("
    UPDATE  qa
    SET     qa_votes = qa_votes +1
    WHERE   qa_id = $question_id;

    SELECT  qa_id, qa_votes
    FROM    qa
    WHERE   qa_id = $question_id;
    ");

【讨论】:

  • 这正是我要建议的。我很想知道这是否有效。
猜你喜欢
  • 2020-07-31
  • 2020-11-17
  • 2017-12-11
  • 2021-07-03
  • 2022-01-22
  • 2019-12-23
  • 2021-11-07
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多