Мне нужно выбрать данные при просмотре страницы и обновить столбец «просмотры». Есть ли способ сделать это в одном запросе или мне нужно использовать для отдельных запросов?






Вам нужно будет сделать это двумя операторами в одной транзакции.
Begin Tran
Update Pages Set Views = Views + 1 Where ID = @ID
Select Columns From Pages Where ID = @ID
Commit Tran
Если вы не хотите / не нуждаетесь в транзакции, вы можете создать хранимую процедуру, которая сначала обновляет счетчик просмотров, а затем выбирает значения и возвращает их пользователю.
В операторе PostgreSQL ОБНОВИТЬ есть предложение RETURNING, которое возвращает набор результатов как оператор SELECT:
UPDATE mytable
SET views = 5
WHERE id = 16
RETURNING id, views, othercolumn;
Я почти уверен, что это нестандартно. Я не знаю, реализуют ли это какие-либо другие базы данных.
Обновлено: я только что заметил, что в вашем вопросе есть тег «MySQL». Возможно, вам стоит упомянуть об этом в самом вопросе. Тем не менее, это хороший общий вопрос о базе данных - я хотел бы посмотреть, как это сделать в других базах данных.
Было бы полезно, если бы вы указали СУБД, которые вы используете SQL Server имеет инструкцию OUTPUT
Пример
USE AdventureWorks;
GO
DECLARE @MyTestVar table (
OldScrapReasonID int NOT NULL,
NewScrapReasonID int NOT NULL,
WorkOrderID int NOT NULL,
ProductID int NOT NULL,
ProductName nvarchar(50)NOT NULL);
UPDATE Production.WorkOrder
SET ScrapReasonID = 4
OUTPUT DELETED.ScrapReasonID,
INSERTED.ScrapReasonID,
INSERTED.WorkOrderID,
INSERTED.ProductID,
p.Name
INTO @MyTestVar
FROM Production.WorkOrder AS wo
INNER JOIN Production.Product AS p
ON wo.ProductID = p.ProductID
AND wo.ScrapReasonID= 16
AND p.ProductID = 733;
SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID,
ProductID, ProductName
FROM @MyTestVar;
GO
Я использовал этот трюк с Java, и SQL Server также позволяет отправлять две команды в одном PreparedStatement.
update tablex set y=z where a=b \r\n select a,b,y,z from tablex
Это должно быть в транзакции с подтверждением чтения, чтобы она работала так, как вы думаете.