mysql从更新返回结果
我想从mysql数据库中选择一组行,并更新这些行的viewsed属性(这是一种“我已经读过这些”标志) 最初我做了这样的事情: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'; 这会很好地选择行,并根据需要更新其“已查看”属性。但它不会从子查询返回所选行 是否有我可以添加的子句,或者可能我需要存储子查询等。。。?我确实考虑了一笔交
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等”。