Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql renvoie les résultats de la mise à jour

Je créerais une fonction simple :

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 ;

qui met à jour les tables et renvoie les identifiants concaténés.

À partir de php, vous appelez ceci :

SELECT mydb.updateMytable()

et vous obtenez des identifiants en un clin d'œil :1,2,7,54,132 etc...

Mise à jour :

ma fonction renvoie une chaîne contenant des identifiants séparés par des virgules :'1,5,7,52,...' ces identifiants sont uniquement ceux qui auraient été mis à jour lors de l'appel de la fonction,

un meilleur exemple php-mysql serait (vous pouvez et utiliseriez 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";
}

n'oubliez pas de changer mydb et mytable selon les noms de vos bases de données

Finale

parce que vous avez besoin de fonctionnalités plus complexes, exécutez simplement deux requêtes :

Première exécution :

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

Prochaine exécution :

UPDATE mytable 
    SET viewed = 1 
WHERE viewed = 0