Jag skulle skapa en enkel funktion:
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 ;
som uppdaterar tabeller och returnerar sammanlänkade ID.
Från php kallar du detta:
SELECT mydb.updateMytable()
och du får id:n i en rörelse:1,2,7,54,132
osv...
Uppdatering:
min funktion returnerar en sträng som innehåller kommaseparerade id:'1,5,7,52,...'
dessa ID är bara de som skulle ha uppdaterats under funktionsanropet,
bättre php-mysql exempel skulle vara (du kan och skulle använda 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";
}
kom också ihåg att ändra mydb
och mytable
enligt dina databasnamn
Slutlig
eftersom du behöver mer komplex funktionalitet kör du helt enkelt två frågor:
Första körningen:
SELECT a, b, c
FROM mytable
WHERE viewed = 0
Nästa körning:
UPDATE mytable
SET viewed = 1
WHERE viewed = 0