如何根据列结果更新行基数?

时间:2016-03-21 06:24:11

标签: mysql

我有2000个数据,所有分配号码是:0000-1111,需要按公司c更新。

id | fullname | company | assign_num
1    sample1   company1   0000-1111
2    sample2   company2   0000-1111
3    sample3   company2   0000-1111
4    sample4   company1   0000-1111
5    sample5   company1   0000-1111

给出了assign_num。

how to UPDATE row by COMPANY? (ex. company 1)
    ex. 
    0000-1112, 0000-1501, 0000-1120

结果将是这样的:

id | fullname | company | assign_num
1    sample1   company1   0000-1112
2    sample2   company2   0000-1111
3    sample3   company2   0000-1111
4    sample4   company1   0000-1501
5    sample5   company1   0000-1120

如果只有100多条记录,我可以手动或查找id,但需要更新一千条记录。

2 个答案:

答案 0 :(得分:1)

没有窗口函数,MySQL完成这项操作有点棘手。

这是一个版本;

UPDATE myTable
JOIN (
  SELECT m1.id, COUNT(m2.id)+1 ord FROM myTable m1
  LEFT JOIN myTable m2 ON m1.id > m2.id AND m1.company = m2.company 
  GROUP BY m1.id
) z1 ON myTable.id = z1.id
JOIN (
  SELECT 1 ord, '0000-1112' assign_num UNION ALL
  SELECT 2 ord, '0000-1501' assign_num UNION ALL
  SELECT 3 ord, '0000-1120' assign_num
) z2
  ON z1.ord = z2.ord
SET myTable.assign_num = z2.assign_num
WHERE myTable.company = 'company1'

基本上,第一个子查询为每个id分配序列号(最低id为1,接下来为2等)每个公司,第二个子查询传递数据(序列号1应该得到' 0000-1112'等等)。然后它只是加入子查询并使用正确的assign_num更新myTable。

An SQLfiddle to test with

并且,提醒一下,在对生产数据库运行可能具有破坏性的SQL之前,请始终备份数据。

答案 1 :(得分:0)

我没有看到任何聪明的方法来执行此操作,因为您基本上想要为每个公司更新具有不同值的assign_num字段。但您也可以使用脚本来执行此操作。

受另一篇文章this answer的启发,您可以尝试以下查询:

UPDATE table_name SET assign_num='test'
     WHERE id IN 
         (SELECT id FROM table_name ORDER BY id ASC LIMIT i, 1)      

您必须将testi变量设置为正确,但只需稍加工作就可以避免手动执行此操作。请注意,此查询可能存在版本问题,如我在上面提到的答案中所述。