2017-01-16 88 views
0

我有一个简单的表是这样的:mysql的更新与选择最小/最大计数组

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) 

但是,它不工作。我得到的错误

未知列 'IDS' 中的 'where子句'

+0

不明白你的榜样结果。 '分组计数是最小3和最大5',但在ids 1到3的行中,gruoped字段是1-0 – Alfabravo

+0

如果您对计数感兴趣,为什么包含group_concat – Strawberry

+0

您可以发布mysql错误吗? –

回答

0

您可以采用如下方案,与子选择:

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

+0

我不喜欢使用更多的子查询选择。 'UPDATE SET错误日志= type_error 'FN' 其中分组(SELECT * FROM(SELECT AS克 分组FROM错误日志ER GROUP BY er.grouped HAVING COUNT(er.id)在3和5)为E )用@Sebastian' – mosleim

0
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) 
+1

解释,我使用更多选择来忽略错误。它看起来就像这样:'UPDATE错误日志SET type_error = 'FN' 凡在分组(SELECT * FROM(SELECT 为G 分组从错误日志呃 GROUP BY er.grouped HAVING COUNT(er.id)3至5 )AS e )' – mosleim

+0

不错。完美的作品。 –