首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL: UPDATE with INNER JOIN with LIMIT

SQL: UPDATE with INNER JOIN with LIMIT
EN

Stack Overflow用户
提问于 2013-02-28 13:31:56
回答 2查看 3.5K关注 0票数 1

我正在尝试更新数据库中的特定列。

下面的查询是有效的:

代码语言:javascript
复制
UPDATE table1 A INNER JOIN table2 B 
ON A.type = B.typeName
SET A.closed = 0, A.sample = 0 
WHERE A.`status` IN ('Finished', 'Exception', 'Query') AND A.date BETWEEN '2013-01-01' AND '2013-01-31' 
AND A.code IN ('ex1','ex2','ex3') 
AND A.closed = 0 AND B.order = 'Non-Order' AND A.userName = 'test';

但是当我试着设置一个限制时,它说:

代码语言:javascript
复制
Incorrect usage of UPDATE and LIMIT

UPDATE table1 A INNER JOIN table2 B 
ON A.type = B.typeName
SET A.closed = 0, A.sample = 0 
WHERE A.`status` IN ('Finished', 'Exception', 'Query') AND A.date BETWEEN '2013-01-01' AND '2013-01-31' 
AND A.code IN ('ex1','ex2','ex3') 
AND A.closed = 0 AND B.order = 'Non-Order' AND A.userName = 'test' LIMIT 3;

如何使用此限制进行此更新?非常感谢!

代码语言:javascript
复制
[EDIT]

我已经做了我想做的,但它很慢,花了6秒来更新3行。

下面是查询:

代码语言:javascript
复制
UPDATE table1 SET closed=1, sample=1
 WHERE id IN (
     SELECT id FROM (
         SELECT id FROM table1 A
         INNER JOIN table2 B ON A.type = B.typeName
         WHERE A.`status` IN ('Finished', 'Exception', 'Query') AND A.date BETWEEN '2013-01-01' AND '2013-01-31' 
    AND A.code IN ('ex1','ex2','ex3') 
    AND A.closed = 0 AND B.order = 'Non-Order' AND A.userName = 'test' LIMIT 3
     ) tmp
 );

我怎样才能优化这个查询呢?再次感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-28 13:35:16

你就是不能。

根据MySQL docs for UPDATE的说法

代码语言:javascript
复制
For the multiple-table syntax, UPDATE updates rows in each table named in
table_references that satisfy the conditions. In this case, ORDER BY and LIMIT
cannot be used. 

更新1

代码语言:javascript
复制
UPDATE  table1 a
        INNER JOIN
        (
            SELECT  id 
            FROM    table1 A
                    INNER JOIN table2 B 
                        ON A.type = B.typeName
            WHERE   A.status IN ('Finished', 'Exception', 'Query') AND 
                    A.date BETWEEN '2013-01-01' AND '2013-01-31' AND 
                    A.code IN ('ex1','ex2','ex3') AND 
                    A.closed = 0 AND 
                    B.order = 'Non-Order' AND 
                    A.userName = 'test' 
            LIMIT   3
        ) tmp ON a.ID = tmp.ID
SET     a.closed = 1, 
        a.sample = 1
票数 4
EN

Stack Overflow用户

发布于 2013-02-28 13:35:34

LIMIT只能用于SELECT语句。如果您想限制no。对于UPDATE语句受影响的记录,您必须使用WHERE。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15128189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档