mysql返回更新结果

时间:2014-07-31 09:03:00

标签: 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中,如果要返回选定的行,则必须使用两个语句来选择和更新,而不是像我的初始帖子中那样使用嵌套语句。

e.g。

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

1 个答案:

答案 0 :(得分:0)

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

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