Увеличить значение столбца в запросе SELECT - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь создать API, и одна из конечных точек вернет случайную строку из моей базы данных.В базе данных у меня есть таблица, в которой я хочу, чтобы столбец «представлений» обновлялся каждый раз, когда я запускаю запрос SELECT для строки.

Моя таблица выглядит примерно так:

CREATE TABLE `movies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(256) NOT NULL,
  `description` text,
  `views` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
);

Строка выбирается путем упорядочения таблицы с помощью rand (), а затем ограничения результата на 1, например:

SELECT * FROM table ORDER BY rand() LIMIT 1;

Возможно ли что-то подобное ниже?

SELECT * FROM table ORDER BY rand() LIMIT 1
UPDATE table SET views = +1 WHERE (selected row?);

Я новичок в SQL-запросах, поэтому я не знаю, является ли это лучшим способом или вообще возможным.Должен ли я выполнить новый запрос после его завершения, который вместо этого обновит значение?

Ответы [ 4 ]

1 голос
/ 23 марта 2019

Обычно каждая таблица имеет первичный ключ, то есть уникальный идентификатор каждой отдельной строки. Поскольку у вас есть результат вашего запроса SELECT и он содержит только 1 строку, вы всегда можете сделать последующий запрос на обновление, например UPDATE table SET views = views + 1 WHERE id = <returned_record_id>. Здесь мы предполагаем, что столбец id является столбцом первичного ключа. Эта пара запросов должна быть выдана кодом приложения. Если вы хотите добиться функциональности SELECT + UPDATE в виде одного оператора SQL, рассмотрите возможность использования хранимых процедур.

Хотя вышеупомянутый подход технически возможен, он может иметь несколько проблем с производительностью. Во-первых, ORDER BY rand() часто имеет плохую производительность. Кроме того, наличие обновлений для каждого выбора может негативно сказаться на производительности.

0 голосов
/ 23 марта 2019

К сожалению, то, что вы хотите сделать, невозможно, по крайней мере, без большой работы.SQL в целом - и MySQL в частности - предоставляют возможность, называемую триггеры .

Триггеры, которые позволяют выполнять действия, когда что-то происходит в базе данных.Например, если вы хотите проверить правильность значений, вы можете написать триггер insert / update, чтобы проверить значения и отклонить неправильные.Или, если вы хотите сохранить удаленные записи в таблице аудита, лучше всего использовать триггер.

То, что вы описываете, может быть реализовано с помощью триггера «select».Такого зверя не существует.

Какие у вас варианты?Ну, самое простое - сделать это в вашем приложении.Когда фильм выбран, вы можете обновить виды.Конечно, это только увеличивает представления, где у вас есть код.

Вы можете переместить этот код в хранимую процедуру.Это упрощает код приложения.Он просто должен «знать», чтобы использовать хранимую процедуру.Но нет механизма принудительного применения.

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

0 голосов
/ 23 марта 2019

Вам необходимо создать для этого процедуру в вашей базе данных, например:

CREATE PROCEDURE `procedure_name`()

BEGIN

    SELECT * FROM table ORDER BY rand() LIMIT 1 ;

    UPDATE table SET views = +1 WHERE (selected row?) ;

END

и затем назвать ее

call procedure_name();

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

Спасибо

0 голосов
/ 23 марта 2019

Нет, что вы хотите, невозможно. Как, команды выбора и обновления не могут использоваться вместе в одной транзакции.Вы можете сделать это отдельно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...