mysql return results from update

前端 未结 1 1887
我在风中等你
我在风中等你 2021-01-28 23:28

I want to select a bunch of rows from a mysql database and update the viewed attribute of those once selected (this is a kind of \'I have read these\' flag).

Initially I

相关标签:
1条回答
  • I would create a simple function:

    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 ;
    

    which updates tables and returns concatenated ids.

    From php you call this:

    SELECT mydb.updateMytable()
    

    and you get ids in a stirng: 1,2,7,54,132 etc...

    Update:

    my function is returning string containing comma separated ids: '1,5,7,52,...' these ids are only which would have been updated during the function call,

    better php-mysql example would be (you may and would use 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";
    }
    

    also remember to change mydb and mytable according to your database names

    Final

    because you need more complex functionality, simply run two query:

    First run:

    SELECT a, b, c
    FROM mytable
    WHERE viewed = 0
    

    Next run:

    UPDATE mytable 
        SET viewed = 1 
    WHERE viewed = 0
    
    0 讨论(0)
提交回复
热议问题