【问题标题】:mysql return results from updatemysql从更新返回结果
【发布时间】:2014-09-23 03:48:32
【问题描述】:

我想从 mysql 数据库中选择一堆行并更新这些行的查看属性(这是一种“我已阅读这些”标志)。

最初我做了这样的事情:

update (
        select a, b, c
        from mytable
        where viewed = '0'
        )
set viewed = '1';

这会很好地选择行并根据需要更新它们的查看属性。但它不会从子查询中返回选定的行。

有没有我可以添加的子句,或者我需要存储子查询等...?我确实考虑过一笔交易,但我最终遇到了同样的问题。我还没有尝试过存储过程...

请有人建议/指出正确的方向,告诉我如何执行上述操作,但另外从子查询中返回选定的表?

提前致谢。

更新:

正如@Barmar、@a_horse_with_no_name、@fancyPants 和@George Garchagudashvil 所指出的......

在 MySQL 中,如果要返回选定的行,则必须使用两个语句来选择和更新,而不是像我最初的帖子中那样使用嵌套语句。

例如

begin;
  select a, b, c
    from mytable
    where viewed = '0';
  update mytable
    set viewed = '1'
    where viewed = '0';
commit;

谢谢大家。

【问题讨论】:

  • UPDATE 和 SELECT 是两个不同的东西。它们必须是两个单独的查询。你想解决什么“问题”?
  • UPDATE 更新,SELECT 选择。你不能同时做这两件事。
  • 先选择行WHERE viewed = 0,然后进行更新。
  • 我试图减少选择,然后更新一个查询 - 以提高效率。我还需要将查看的属性设置为原子的,因为它是一个“读取”标志。不要忘记我需要选择结果 - 这是上面的问题。
  • 为什么要在同一个查询中尝试选择和更新?你不能分两步做你想做的事吗?

标签: mysql sql select sql-update


【解决方案1】:

我会创建一个简单的函数:

DELIMITER $$

DROP FUNCTION IF EXISTS `mydb`.`updateMytable`$$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    FUNCTION `mydb`.`updateMytable`() RETURNS TEXT 

    BEGIN

        SET @updated := '';

        UPDATE mytable
            SET viewed = 1
        WHERE viewed = 0
            AND ( 
                SELECT @updated := CONCAT_WS(',', @updated, id) 
            ) != ''
        ;

        RETURN TRIM(LEADING ',' FROM @updated); 

    END$$
DELIMITER ;

更新表并返回连接的 ID。

从 php 你这样称呼:

SELECT mydb.updateMytable()

然后你会得到 ids:1,2,7,54,132 等等...

更新:

我的函数正在返回包含逗号分隔 ID 的字符串: '1,5,7,52,...' 这些 id 只是在函数调用期间会更新的,

更好的 php-mysql 示例是(您可能并且会使用 PDO):

$query = "SELECT mydb.updateMytable()";
$res = mysql_query($query);
$arr = mysql_fetch_array($res);

$ids = explode(',', $arr[0]);

// now you can do whatever you want to do with ids
foreach ($ids as $id) 
{
    echo "Hoorah: updated $id\n";
}

还记得根据你的数据库名称更改mydbmytable

决赛

因为您需要更复杂的功能,只需运行两个查询:

首次运行:

SELECT a, b, c
FROM mytable
WHERE viewed = 0

下一次运行:

UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0

【讨论】:

  • 谢谢乔治。我正在考虑一个函数,存储过程或触发器是要走的路,但不禁认为这应该可以通过对我的原始查询进行一些简单的更改来实现。那就是说我不确定你的函数中你返回的是什么(TBH我不得不查找一些东西:))?请解释一下?
  • 我添加了更多解释,它只返回单个字符串列,您可以在以后轻松操作它,希望我对代码有更好的理解:))
  • 感谢您的解释。恐怕这根本不想要我想要的——也许我最初的例子是缺乏的。这将返回一系列表示更新行的 id。我希望根据上面的子查询更新行,例如'选择 a、b、c 等...'。
猜你喜欢
  • 2021-05-06
  • 2013-08-24
  • 1970-01-01
  • 2015-02-24
  • 2022-01-18
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多