【问题标题】:UPDATE and SELECT from same table in one query在一个查询中从同一个表中更新和选择
【发布时间】:2018-06-20 07:02:25
【问题描述】:

我正在尝试计算 table1 中的行数,并根据行数更新某个列。以下是我尝试过的查询,但收到一个错误提示说 temp 不是表。

UPDATE table1 AS t1
INNER JOIN table1 AS temp ON temp.id = t1.id
SET
t1.field1 = (CASE
    WHEN (SELECT COUNT(*) FROM temp WHERE temp.field1 = 1) < 100 THEN 1
    WHEN (SELECT COUNT(*) FROM temp WHERE temp.field1 = 2) < 100 THEN 2
    WHEN (SELECT COUNT(*) FROM temp WHERE temp.field1 = 3) < 100 THEN 3
    WHEN (SELECT COUNT(*) FROM temp WHERE temp.field1 = 4) < 100 THEN 4
    WHEN (SELECT COUNT(*) FROM temp WHERE temp.field1 = 5) < 100 THEN 5
END)
WHERE t1.id IN(100, 200, 300); --Example data

【问题讨论】:

标签: mysql select join sql-update


【解决方案1】:

几件事:

  1. 我建议为您的案例制作一个临时数据表 声明,然后加入该声明以进行更新。

  2. 重新加入您正在更新的表不起作用。

  3. 您的 where 子句中有语法错误。你不需要那个 IN 之前的等号。

试试:

DROP TABLE IF EXISTS temp_table1;
CREATE TEMPORARY TABLE temp_table1 AS
SELECT field1,count(*) as field_count FROM table1 group by field1;

UPDATE table1 AS t1
LEFT JOIN temp_table1 aa
  ON aa.field1= t1.field1
SET t1.field1 = (CASE 
  WHEN aa.field1 = 1 AND aa.field_count < 100 THEN 1 
  WHEN aa.field1 = 2 AND aa.field_count < 100 THEN 2 
  WHEN aa.field1 = 3 AND aa.field_count < 100 THEN 3 
  WHEN aa.field1 = 4 AND aa.field_count < 100 THEN 4 
  WHEN aa.field1 = 5 AND aa.field_count < 100 THEN 5 END)
WHERE t1.id IN (100, 200, 300); 

【讨论】:

  • 我想避免做第一个,因为该表有超过 500k 行,最终复制它们会成为性能问题等等。有没有办法在没有另一个临时表的情况下做到这一点(加入和更新同一张表)。
  • 看我的例子。您不需要复制整个表,只需复制 case 语句所需的内容即可。此外,使用子查询重新打开您正在更新的表是非法的。
【解决方案2】:

以下查询将对您有所帮助,

UPDATE table1 as t1
SET
t1.field1 = (CASE         
    WHEN (select p.cnt from (SELECT COUNT(*) as cnt FROM table1 t2 WHERE t2.field1= 1) as p) < 100 THEN 1
    WHEN (select p.cnt from (SELECT COUNT(*) as cnt FROM table1 t2 WHERE t2.field1= 2) as p) < 100 THEN 2
    WHEN (select p.cnt from (SELECT COUNT(*) as cnt FROM table1 t2 WHERE t2.field1= 3) as p) < 100 THEN 3
    WHEN (select p.cnt from (SELECT COUNT(*) as cnt FROM table1 t2 WHERE t2.field1= 4) as p) < 100 THEN 4
    WHEN (select p.cnt from (SELECT COUNT(*) as cnt FROM table1 t2 WHERE t2.field1= 5) as p) < 100 THEN 5    
 END)
WHERE t1.id IN(100, 200, 300)

【讨论】:

  • 你不像我在上面做的那样在连接中按 id 过滤,否则这就是我想要的。
  • 对于您的要求,加入毫无意义。就您的要求而言,上述查询就足够了。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
相关资源
最近更新 更多