我想从 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;
谢谢大家。
最佳答案
我会创建一个简单的函数:
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,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";
}
还记得根据您的数据库名称更改mydb
和mytable
决赛
因为您需要更复杂的功能,只需运行两个查询:
首次运行:
SELECT a, b, c
FROM mytable
WHERE viewed = 0
下次运行:
UPDATE mytable
SET viewed = 1
WHERE viewed = 0
关于mysql返回更新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25054844/