SELECT查询上的列值增加

时间:2019-03-23 09:48:34

标签: mysql sql

我正在尝试构建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 个答案:

答案 0 :(得分:1)

通常,每个表都有一个主键,即每行的唯一ID。由于您有SELECT查询的结果,并且只有1行,因此您始终可以进行诸如UPDATE table SET views = views + 1 WHERE id = <returned_record_id>之类的后续更新查询。在这里,我们假设列id是主键列。这对查询需要由应用程序代码发出。如果您想通过单个SQL语句实现SELECT + UPDATE功能,请考虑使用存储过程。

虽然上述方法在技术上是可行的,但可能会遇到一些性能问题。首先,ORDER BY rand()的性能通常很差。另外,对每个选择进行更新可能会影响性能。

答案 1 :(得分:0)

没有你想要的东西是不可能的。因为,选择和更新命令不能在单个事务中使用。 您可以单独进行

答案 2 :(得分:0)

您需要在数据库中为此创建一个过程,例如:

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();

由于存在许多编写过程的方法,因此您只能进行检查。

谢谢

答案 3 :(得分:0)

不幸的是,您想做的事情是不可能的,至少没有很多工作是不可能的。总体而言,SQL(尤其是MySQL)提供了称为 triggers 的功能。

触发可让您在数据库中发生某些事情时采取措施。例如,如果要检查值是否正确,可以编写insert / update触发器来检查值并拒绝不正确的值。或者,如果您想将已删除的记录存储到审计表中,则可以使用触发器。

您所描述的内容可以使用“选择”上的触发器来实现。这样的野兽不存在。

您有什么选择?好吧,最简单的方法就是在您的应用程序中执行此操作。选择电影后,即可更新视图。当然,那只会增加代码所在的视图。

您可以将此代码移动到存储过程中。这简化了应用程序代码。它只需要“知道”即可使用存储过程。但是,没有执行机制。

您可以使用权限使此操作更具可执行性。基本上,不允许通过存储过程访问基础表 。这是最接近您想要的东西。