mysql返回更新结果

标签 mysql sql select sql-update

我想从 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";
}

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

决赛

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

首次运行:

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/

相关文章:

Python:删除 x 天前的 mySQL 行

mysql - 用于扩展后端的正确架构

sql - 使用 sql/sequelize 通过 userId 获取喜欢的帖子并获取帖子的喜欢计数

mysql - vb.net中搜索程序的Sql查询

c# - 当我用其答案填充 DataTable(使用 DataAdapter)时,不应该返回任何内容的 SQL SELECT 命令会返回什么?

javascript - jQuery - 排除被单击元素的父元素

mysql - 在 GROUP BY 中使用 LIMIT 两次获得每组 N 个结果

mysql - 如何使用 case 语句从另一行分配值?

mysql - SQL查询中连接计数和非分组属性

mysql - 想要避免选择连接查询中的特定行...请参阅说明