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