MySQL 查询 - 在 UPDATE 中使用 SELECT

标签 mysql sql database select offset

我正在尝试使用 SELECT 和 OFFSET 选择数据库中的特定行。我得到的结果是合乎逻辑的,我确实得到了我想要的行。但然后我需要更新同一特定行,所以我做了类似的事情:

UPDATE table 
SET value=1 
WHERE value IN (SELECT * FROM(
SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab);

现在我对这段代码的期望是仅更新所选行。相反,它会更新数据表中的所有行并将其值设置为 1。

当我只使用时:

SELECT * FROM(
    SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab

我只得到 1 行作为输出。 (LIMIT 1 OFFSET 2 确保我确实获得了第 1 行,并且这是第 2 个可用的行)我不太确定我做错了什么或我应该如何实现这一目标。

注意:我必须使用 SELECT 而不是使用行的唯一 ID 或类似内容的其他方法。 任何帮助将不胜感激。

最佳答案

首先,当使用LIMITOFFSET时,您还需要使用ORDER BY。否则您得到的行是不确定的。

一种方法在UPDATE本身中使用LIMIT。但是,UPDATE 不允许 OFFSET。所以:

UPDATE table 
    SET value = 1 
    WHERE some criteria
    ORDER BY ??
    LIMIT 1;

最好的方法是使用唯一的 ID。您可以使用双子查询方法来做到这一点:

UPDATE table 
    SET value = 1 
    WHERE id IN (SELECT id
                 FROM (SELECT id
                       FROM table
                       WHERE some criteria
                       ORDER BY ??
                       LIMIT 1 OFFSET 2
                      ) t
                );

如果您没有唯一的 ID,则可以使用多个列来唯一定义单行。

关于MySQL 查询 - 在 UPDATE 中使用 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36953681/

相关文章:

使用 where 子句进行 2400 万行的 mysql 查询

php - PHP-api 中的 Sphinx avg 函数

php - 错误回波计数

php - mysql 中的日期设置为 0000-00-00,为什么?

MySQL转换为日期时间语法错误: unexpected IDENT_QUOTED

SQL - 如何建立同期群分析

sql - 使用 Groupby 对不同窗口函数进行计数

php - 删除数据库中的重复项

MySQL:如何插入具有相同ID自动增量的多条记录

java - 使用 mysql J 连接器连接到 memsql 时出错