Вопрос:

MySQL колонка обновления, затем выберите обновленное значение

mysql sql

29967 просмотра

5 ответа

8538 Репутация автора

У меня есть такой стол

tbl_user

id
user_id
amount

Сначала я хочу обновить строку на основе идентификатора

$amount = 123; // dyanamic value
$sql = "UPDATE tbl_user SET amount=amount-'$amount' WHERE id='$id' LIMIT 1 ";

Теперь я хочу получить обновленное значение столбца суммы я применил этот sql

$sql = "SELECT amount FROM tbl_user  WHERE id='$id'  LIMIT 1 ";

мой вопрос, могу ли я объединить оба выше SQL или любой отдельный запрос для достижения вышеупомянутой задачи?

Автор: Satish Sharma Источник Размещён: 11.07.2014 06:43

Ответы (5)


1 плюс

30315 Репутация автора

Это невозможно с одним запросом, но вы можете объединить несколько команд в сценарий и выполнить их с помощью одного запроса к серверу базы данных.

Запустите этот скрипт:

"UPDATE tbl_user SET amount=amount-'$amount' WHERE id='".$id."';SELECT amount FROM tbl_user  WHERE id='".$id."'; "

Также вы можете проверить, является ли $ id числом, так как я не вижу защиты от внедрения SQL внутри вашего кода. SQL-инъекция представляет собой серьезную угрозу, вам лучше подготовиться и защититься от нее.

Автор: Lajos Arpad Размещён: 11.07.2014 07:13

27 плюса

7442 Репутация автора

Решение

Лучшее, что вы можете имитировать, - это использовать две строки запросов, возможно, с помощью такой переменной:

 UPDATE tbl_user SET
     amount = @amount := amount-'$amount'
 WHERE id='$id' LIMIT 1;

 SELECT @amount;

Лучшее, что вы можете сделать, это создать Stored Procedureподобное:

 DELIMITER //

 CREATE PROCEDURE `return_amount` ()
 BEGIN
    UPDATE tbl_user SET
     amount = @amount := amount-'$amount'
    WHERE id='$id' LIMIT 1;

    SELECT @amount;
 END //

А потом позвониStored Procedure в свой PHP.

Примечание: PostgreSQLимеет такую ​​опцию использования RETURNINGоператора, которая будет выглядеть следующим образом:

 UPDATE tbl_user SET amount=amount-'$amount' 
 WHERE id='$id' LIMIT 1
 RETURNING amount

Смотри здесь

Автор: Edper Размещён: 17.07.2014 09:21

1 плюс

540 Репутация автора

Здесь будет процедура

CREATE PROCEDURE UpdateAndSelect
(
    @amount MONEY,
    @id INT
)
AS
BEGIN

   UPDATE tbl_user
   SET amount = @amount
   WHERE id = @id
   LIMIT 1

   SELECT amount
   FROM tbl_user
   WHERE id = @id
   LIMIT 1

END
GO

Вы бы вызвали эту хранимую процедуру, установив переменные (@amoutn и @id), а затем вызвав:

exec UpdateAndSelect

Надеюсь, это поможет решить вашу проблему

Автор: Lemuel Botha Размещён: 17.07.2014 09:22

2 плюса

466 Репутация автора

Мы также можем использовать:

UPDATE  tbl_user  SET id = LAST_INSERT_ID(id),  amount = 2.4,user_id=4 WHERE id = 123;

// SELECT
$id =SELECT LAST_INSERT_ID();
SELECT amount,user_id FROM tbl_user  WHERE id = $id   LIMIT 1
Автор: Gauttam Jada Размещён: 17.07.2014 11:00

4 плюса

2903 Репутация автора

Функция может сделать это легко. Похоже, вы хотите ограничить, сколько раз ваш код подключается к базе данных. С сохраненной функцией или процедурой вы делаете только одно соединение. Да, у хранимой функции есть два запроса (обновить, затем выбрать), но они выполняются на стороне сервера, не останавливаясь, чтобы совершать поездки к клиенту.

http://sqlfiddle.com/#!2/0e6a09/1/0

Вот мой скелет вашего стола:

CREATE TABLE tbl_user (
  id       VARCHAR(100) PRIMARY KEY,
  user_id  VARCHAR(100),
  amount   DECIMAL(17,4) );

INSERT INTO tbl_user VALUES ('1', 'John', '100.00');

И предлагаемая функция:

CREATE FUNCTION incrementAmount
  (p_id VARCHAR(100), p_amount DECIMAL(17,4))
RETURNS DECIMAL(17,4)
BEGIN
  UPDATE tbl_user
SET amount = amount + p_amount
WHERE id = p_id;
  RETURN (SELECT amount FROM tbl_user WHERE id = p_id);
END
//

Затем вы просто запускаете один запрос a SELECTдля только что созданной вами функции:

SELECT incrementAmount('1', 5.00)

Результат запроса:

105
Автор: Joshua Huber Размещён: 17.07.2014 01:33
Вопросы из категории :
32x32