Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql从更新返回结果_Mysql_Sql_Select_Sql Update - Fatal编程技术网

mysql从更新返回结果

mysql从更新返回结果,mysql,sql,select,sql-update,Mysql,Sql,Select,Sql Update,我想从mysql数据库中选择一组行,并更新这些行的viewsed属性(这是一种“我已经读过这些”标志) 最初我做了这样的事情: update ( select a, b, c from mytable where viewed = '0' ) set viewed = '1'; 这会很好地选择行,并根据需要更新其“已查看”属性。但它不会从子查询返回所选行 是否有我可以添加的子句,或者可能我需要存储子查询等。。。?我确实考虑了一笔交

我想从mysql数据库中选择一组行,并更新这些行的viewsed属性(这是一种“我已经读过这些”标志)

最初我做了这样的事情:

update (
        select a, b, c
        from mytable
        where viewed = '0'
        )
set viewed = '1';
这会很好地选择行,并根据需要更新其“已查看”属性。但它不会从子查询返回所选行

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

请有人给我提供建议/指出正确的方向,告诉我如何执行上面的操作,并且从子查询返回所选的表

提前谢谢

更新:

SELECT a, b, c
FROM mytable
WHERE viewed = 0
UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0
正如@Barmar,@a_horse_,没有名字,@fancyPants和@George Garchagudashvil所指出的那样

在MySQL中,如果要返回所选行,必须使用两条语句进行选择和更新,而不是像我的第一篇文章中那样使用嵌套语句

e、 g


谢谢大家。

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

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()
你可以在一个字符串中得到ID:
1,2,7,54132
等等

更新:

SELECT a, b, c
FROM mytable
WHERE viewed = 0
UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0
我的函数返回包含逗号分隔ID的字符串:
'1,5,7,52,…'
这些ID仅在函数调用期间更新

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

还记得根据数据库名称更改
mydb
mytable

决赛

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

第一次跑步:

SELECT a, b, c
FROM mytable
WHERE viewed = 0
UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0
下次跑步:

SELECT a, b, c
FROM mytable
WHERE viewed = 0
UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0

更新和选择是两件不同的事情。它们必须是两个独立的查询。您试图解决什么“问题”?更新更新,选择选择。您不能同时执行这两项操作。请先选择行
WHERE viewsed=0
,然后执行更新。我正在尝试将一次选择和一次更新减少为一个查询,以提高效率。我还需要将viewsed属性设置为原子属性,因为它是一个“read”标志。别忘了我需要选择结果-这就是上面的问题。为什么要在同一个查询中尝试选择和更新?你不能分两步做你想做的吗?谢谢乔治。我认为函数、存储过程或触发器是一种可行的方法,但我忍不住想,通过对原始查询进行一些简单的更改,这应该是可能的。也就是说,我不确定在你的函数中你返回了什么(TBH我必须查找一些东西:)?请解释一下?我添加了更多的解释,它只返回一个字符串列,以后您可以根据需要轻松操作它,希望我对代码有更好的理解:))谢谢您的解释。恐怕这根本不是我想要的——也许我最初的例子是缺乏的。这将返回一系列表示更新行的id。我希望根据上面的子查询更新行,例如“选择a、b、c等”。