【问题标题】:Mysql Update with selection min/max count group带有选择最小/最大计数组的 Mysql 更新
【发布时间】:2017-01-16 15:32:37
【问题描述】:

我有一个像这样的简单表格:

id  grouped  type_error
--  -------  ------------------ 
1   1-0      TL           
2   1-0      TL           
3   1-0      TL           
4   1-1      TL           
5   1-2      TL      
6   1-2      TL      
7   1-3      TL      
8   1-3      TL      
9   1-3      TL      
10  1-3      TL      

我只想将表格更新为这样:

id  grouped  type_error
--  -------  ------------------ 
1   1-0      FN           
2   1-0      FN           
3   1-0      FN           
4   1-1      TL           
5   1-2      TL      
6   1-2      TL      
7   1-3      FN      
8   1-3      FN      
9   1-3      FN      
10  1-3      FN      

我想更新分组计数最小 3 和最大 5 的位置:

我只是有这样的查询:

update errorlog set type_error = 'FN' where id in
(select group_concat(id) as ids from errorlog where ids > 2 group by grouped)

但是,它不起作用。我得到了错误

“where 子句”中的未知列“ids”

【问题讨论】:

  • 不理解您的示例结果。 grouped count is min 3 and max 5 但在 ID 为 1 到 3 的行中,分组字段为 1-0
  • 如果您对计数感兴趣,为什么要包含 group_concat
  • 你能把mysql的错误贴出来吗?
  • @JochenSchultz 'where 子句'中的未知列'ids'。
  • @Alfabravo,如果我的英语不好,请多多关照。我需要使用 group by grouped coulumn 更新 count(id) 在 3 和 4 之间的位置。

标签: mysql group-by sql-update max min


【解决方案1】:

您可以使用以下解决方案,带有子选择:

UPDATE errorlog SET type_error = 'FN'
WHERE grouped IN (
  SELECT * FROM (
    SELECT grouped 
    FROM errorlog 
    GROUP BY grouped 
    HAVING COUNT(id) BETWEEN 3 AND 5
  )x
);

在这里你可以找到一个工作演示: http://sqlfiddle.com/#!9/311a01/1/0

【讨论】:

  • 它适用于更多子查询选择。 UPDATE errorlog SET type_error = 'FN' WHERE grouped IN ( SELECT * FROM( SELECT grouped AS g FROM errorlog er GROUP BY er.grouped HAVING COUNT(er.id) BETWEEN 3 AND 5) AS e )
【解决方案2】:
UPDATE table SET type_error = 'FN' 
WHERE grouped IN (
    SELECT grouped 
    FROM table 
    GROUP BY grouped 
    HAVING COUNT(id) BETWEEN 3 AND 5
)

不幸的是,在 mysql 中产生了一个错误:

ERROR 1093 (HY000): You can't specify target table 'errorlog' for update in FROM clause

所以扩展Sebastian 答案我会分两步完成:

MariaDB [test]>
MariaDB [test]> drop table IF EXISTS targets;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MariaDB [test]>
MariaDB [test]> create temporary table IF NOT EXISTS targets as
    -> (SELECT grouped
    ->     FROM errorlog
    ->     GROUP BY grouped
    ->     HAVING COUNT(id) BETWEEN 3 AND 5);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]>
MariaDB [test]> UPDATE errorlog a SET type_error = 'FN'
    -> WHERE exists (select 1 from targets t where t.grouped = a.grouped);
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7  Changed: 7  Warnings: 0

MariaDB [test]>
MariaDB [test]> select * from errorlog order by id;
+------+---------+------------+
| id   | grouped | type_error |
+------+---------+------------+
|    1 | 1-0     | FN         |
|    2 | 1-0     | FN         |
|    3 | 1-0     | FN         |
|    4 | 1-1     | TL         |
|    5 | 1-2     | TL         |
|    6 | 1-2     | TL         |
|    7 | 1-3     | FN         |
|    8 | 1-3     | FN         |
|    9 | 1-3     | FN         |
|   10 | 1-3     | FN         |
+------+---------+------------+
10 rows in set (0.00 sec)

【讨论】:

  • 用@Sebastian 解释,我使用更多选择来忽略错误。它看起来像这样:UPDATE errorlog SET type_error = 'FN' WHERE grouped IN ( SELECT * FROM( SELECT grouped AS g FROM errorlog er GROUP BY er.grouped HAVING COUNT(er.id) BETWEEN 3 AND 5) AS e )
  • 不错。完美运行。
猜你喜欢
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多