有没有办法组合这两个 MySQL 语句?

Posted

技术标签:

【中文标题】有没有办法组合这两个 MySQL 语句?【英文标题】:Is there a way of combining these 2 MySQL statements? 【发布时间】: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;
    ");

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

【问题讨论】:

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

【讨论】:

这正是我要建议的。我很想知道这是否有效。

以上是关于有没有办法组合这两个 MySQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法结合这两个循环?

有没有办法组合 mysqli 查询或给它们一个优化序列?

织梦dedecms使用Mysql8.0无法登录后台的解决办法

织梦dedecms使用Mysql8.0无法登录后台的解决办法

有没有办法正确集成两个(或更多)Spring-Boot 项目?

有没有办法在一个中写两个“in”语句?