我有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,但需要更新一千条记录。
答案 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。
并且,提醒一下,在对生产数据库运行可能具有破坏性的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)
您必须将test
和i
变量设置为正确,但只需稍加工作就可以避免手动执行此操作。请注意,此查询可能存在版本问题,如我在上面提到的答案中所述。