mysqli_num_rows mysqli_affected_rows mysql_num_rows filas ejemplo affected afectadas php mysql

php - mysqli_affected_rows - Obtener valor actualizado en MySQL en lugar de filas afectadas



mysqli_num_rows (5)

He estado tratando de encontrar una respuesta a esta pregunta, pero no he encontrado ningún "sí" o "no" definitivo en todas mis investigaciones.

Estoy ejecutando una consulta de MySQL simple como esta:

UPDATE item SET `score`=`score`+1 WHERE `id`=1

¿Hay alguna forma de que la consulta devuelva el valor actualizado, en lugar del número de filas afectadas? Solo como referencia, estoy haciendo esto en PHP, para que el código real se vea como:

$sql = "UPDATE item SET `score`=`score`+1 WHERE `id`=1"; $new_value = mysql_query($sql); //Unfortunately this does not return the new value

Sé que podría hacer una segunda consulta y simplemente SELECCIONAR el valor, pero estoy tratando de reducir las consultas tanto como sea posible. ¿Hay alguna manera?



No, no puedes. Podría realizar una función o un procedimiento almacenado que podría hacer la inserción y devolver el valor actualizado, pero que aún requeriría que ejecute dos consultas desde la función o el procedimiento almacenado.


Puede crear un disparador y sabrá todo sobre las modificaciones.


Puede hacerlo con un procedimiento almacenado que se actualice, y luego seleccione el nuevo valor en un parámetro de salida. Lo siguiente devuelve una columna new_score con el nuevo valor.

DELIMITER $$ -- Change DELIMITER in order to use ; withn the procedure CREATE PROCEDURE increment_score ( IN id_in INT ) BEGIN UPDATE item SET score = score + 1 WHERE id = id_in; SELECT score AS new_score FROM item WHERE id = id_in; END $$ -- Finish CREATE PROCEDURE statement DELIMITER ; -- Reset DELIMITER to standard ;

En PHP:

$result = mysql_query("CALL increment_score($id)"); $row = mysql_fetch_array($result); echo $row[''new_score''];


Si no desea ejecutar otra consulta SELECT, aquí hay otra forma de hacerlo. He modificado el código del Sr. Berkowski para referencia:

DELIMITER $$ CREATE PROCEDURE increment_score ( IN id_in INT ) BEGIN set @newScore := null; UPDATE item SET score = IF((@newScore := score+1) <> NULL IS NULL, @newScore, NULL) WHERE id = id_in; SELECT @newScore; END DELIMITER ;