2016-04-30 108 views
1

我想使用SELECT和OFFSET在数据库中选择特定的行。我得到的结果是合乎逻辑的,我确实得到了我想要的所需行。但后来我需要让我做这样的事情来更新同一特定行:MySQL查询 - 在更新中使用SELECT

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行作为输出。 (极限1偏移2确保我得到1行,并且它是第二个可用)我不完全确定我做错了什么或者我应该如何实现这一点。

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

+0

不要使用'value'。使用像'id'这样独特的东西。 '... WHERE id IN ...' –

+0

@juergend d在我的情况下,我需要使用SELECT语句来指定特定的行和我选择它的方式是通过使用OFFSET X(因为WHERE中的标准原因使确定我得到了我想要的行,但然后我只需要从他们1),我期望的是,该值设置为1只在选定的行,我做了WHERE值IN(选择),而是将SET应用于所有行在表中,不仅仅是选择。对不起,我的英文不好,万一你在理解我时遇到问题。 – Chogart

+0

我明白了。但为什么使用'your_table'中的SELECT值? (UPDATE表 SET value = 1 WHERE id IN(SELECT * FROM( SELECT id FROM table WHERE some criteria LIMIT 1 OFFSET 2)temp_tab)'instead。 –

回答

1

首先,当使用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,您可以使用唯一定义单个行多列。

+1

太棒了!谢谢你,这正是解决我的问题。那么,不完全是......但它让我更好地了解事情是如何运作的,所以我设法实现了我的目标。再一次感谢你! – Chogart