MySQL 查询 - 在 UPDATE 中使用 SELECT
MySQL query - Use SELECT inside an UPDATE
我正在尝试使用 SELECT 和 OFFSET select 数据库中的特定行。我得到的结果是合乎逻辑的,我确实得到了我想要的行。但是后来我需要更新相同的特定行,所以我做了类似的事情:
UPDATE table
SET value=1
WHERE value IN (SELECT * FROM(
SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab);
现在我对这段代码的期望是仅更新 selected 行。相反,它更新数据表中的所有行并将它们的值设置为 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 或类似内容的其他方法。
任何帮助将不胜感激。
首先,当使用 LIMIT
和 OFFSET
时,您还需要使用 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,您可以使用多个列来唯一定义一行。
我正在尝试使用 SELECT 和 OFFSET select 数据库中的特定行。我得到的结果是合乎逻辑的,我确实得到了我想要的行。但是后来我需要更新相同的特定行,所以我做了类似的事情:
UPDATE table
SET value=1
WHERE value IN (SELECT * FROM(
SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab);
现在我对这段代码的期望是仅更新 selected 行。相反,它更新数据表中的所有行并将它们的值设置为 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 或类似内容的其他方法。 任何帮助将不胜感激。
首先,当使用 LIMIT
和 OFFSET
时,您还需要使用 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,您可以使用多个列来唯一定义一行。