【问题标题】:Update column set with sequence loop?使用序列循环更新列集?
【发布时间】:2016-01-11 16:11:30
【问题描述】:

我有一个包含大约 533,000 条记录的数据库(邮件)。我正在尝试创建组,基本上,我可以用来选择一个记录区域。我想创建 10 个组。

所以在“邮件”中,我有一个名为“组”的列。我想在每条记录中插入一个数字(从 1 到 10)。一旦我达到 10,我想从 1 开始再次循环序列。

更新列“组”后数据库的外观示例

  • 名字,姓氏,1
  • 名,姓,2
  • 名,姓,3
  • 名,姓,4
  • 名,姓,5
  • 名字,姓氏,6
  • 名字,姓氏,7
  • 名字,姓氏,8
  • 名字,姓氏,9
  • 名字,姓氏,10
  • 名字,姓氏,1
  • 名字,姓氏,2 ...

【问题讨论】:

  • 哪个数据库引擎?你有没有尝试过?
  • 大部分数据库都可以根据ID等序数值的排序顺序动态生成序列号/行号,这比硬编码这样的值要好,删除记录怎么办?
  • Jcl:引擎是 InnoDB
  • Alex K.:这是个好问题。我只是还没有跨过那座桥。理想情况下,如果有订阅者被插入或删除,最好能自动更新数据库中的序列循环。数据库中序列的目的是因为在其他轮换中,当我们向订阅者发送邮件时,我需要选择不同的人群。

标签: mysql sql loops sequence


【解决方案1】:

既然你提到了 InnoDB,我在这里假设 MySQL。

所以我想说:

SET @grp:=-1;
UPDATE Table set `Group`=(@grp:=(@grp+1)%10) + 1;

也就是说,我不会采用这种方法,我只是想回答具体问题

在这里提琴:http://sqlfiddle.com/#!9/82113/1

【讨论】:

  • 我在 'group=@groups:=((@groups+1)%10)+1 附近遇到语法错误
  • 我做了一点修改。在这里也做了一个小提琴:sqlfiddle.com/#!9/82113/1。似乎对我有用。请注意,group 是保留字,因此如果您将其用于您的字段,则需要将其括在反引号中
  • 成功了,我不得不稍微修改一下,但我已经让它工作了。
【解决方案2】:

我认为这不是管理排除列表和联系策略的正确方法。相反,您应该保留一份列表(在表格中),列出在特定邮寄过程中联系过的人。然后,下次邮寄,可以选择上一次没有邮寄的人。

如果您确实有一些真正的业务需要将联系人分成十个大小相等的组,那么请考虑如何维护:

  • 添加/删除/删除人员时会发生什么?
  • 添加新人时,他们是进入“下一个待邮寄”组(以便他们快速收到邮件),还是随机分配到组?
  • 当新经理出现并想要 8 个组时会发生什么?还是 12 个?

无论如何,如果您继续采用这种方法,我建议您只是随机分配每个人:

update t
    set grp = floor(rand() * 10);

【讨论】:

  • 这些问题的答案也相当复杂。基本上,所有订阅者都被分成多个区域。 1 周我们邮寄到“东北”地区,这是我们选择的预定义数量的州。但我们不想在那周向“东北”地区的所有订阅者发送邮件,只发送给“第 1 组”。然后下次我们邮寄到NE地区时,我可以邮寄到第2组,然后是第3组,依此类推。至于我们如何管理新的/删除的记录,我还没有弄清楚将它们排序的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2016-08-04
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多