5

从这个问题:在mysql中使用限制更新多行?我为 MySQL 查询编写了这段代码:

UPDATE clientes SET telemarketer =1
WHERE telemarketer IN (
     SELECT telemarketer FROM (
         SELECT telemarketer FROM clientes 
         WHERE telemarketer=0
         ORDER BY telemarketer DESC
         LIMIT 0, 10
     ) temporal
 );

但它返回一个SELECT telemarketer FROM clientes.

环顾四周,我发现ORDER BY在这种情况下需要它,否则它将返回随机行。

为什么不LIMIT工作?

已经尝试使用LIMIT 10代替LIMIT 0, 10并得到相同的结果。

4

3 回答 3

4

让我们从最里面的选择开始;

 SELECT telemarketer FROM clientes 
 WHERE telemarketer=0

...返回零行或多行 0,因为这是唯一允许返回的值。order by 无关紧要,因为所有行都具有相同的值,并且限制仅将零的数量限制为 10。

这意味着您的整个查询;

UPDATE clientes SET telemarketer =1
WHERE telemarketer IN (
   SELECT telemarketer FROM (
      SELECT telemarketer FROM clientes 
      WHERE telemarketer=0
      ORDER BY telemarketer DESC
      LIMIT 0, 10
   ) temporal
);

...变成;

UPDATE clientes SET telemarketer =1
WHERE telemarketer IN (0, 0, ..., 0);

如果 telemarketer 为 0 的行超过 10 行,则无论内部查询的限制如何,都将返回它们。

您可能想要的是使用唯一字段(主键?)来标识您要更新的行;

UPDATE clientes SET telemarketer=1 
WHERE primary_key IN (
  SELECT primary_key FROM (
    SELECT primary_key FROM clientes WHERE telemarketer=0 LIMIT 10
  ) a
)

一个用于测试的 SQLfiddle

于 2013-09-12T17:17:12.700 回答
1

Try to do group_concat to get comma separated values used for IN

UPDATE clientes SET telemarketer =1
WHERE telemarketer IN (
     IFNULL(GROUP_CONCAT(
         SELECT c.telemarketer FROM clientes c 
         WHERE c.telemarketer=0
         ORDER BY c.telemarketer ASC
         LIMIT 10
     ),0) 
 );

Here we check for NULL values that if there would be 0 rows then we replace it with 0.

于 2013-09-12T17:13:08.923 回答
0

问题在于您如何使用UPDATE. 从http://dev.mysql.com/doc/refman/5.6/en/subquery-restrictions.html

通常,您不能在子查询中修改表并从同一个表中进行选择。

这意味着您不能在UPDATE语句中使用这样的子查询。你需要做的是把它分成两个或多个语句,第一个用电话推销员列表构建一个临时表:

CREATE TEMPORARY TABLE temporal (telemarketer int);

INSERT INTO temporal
     SELECT telemarketer FROM clientes 
     WHERE telemarketer=0
     ORDER BY telemarketer DESC
     LIMIT 0, 10

然后您可以在更新中使用此表:

UPDATE clientes SET telemarketer =1
WHERE telemarketer IN (SELECT telemarketer FROM temporal);

DROP TABLE temporal;
于 2013-09-12T17:23:53.050 回答