循环访问辅助记录ID的数字范围

时间:2011-11-14 10:24:16

标签: sql ruby-on-rails ruby-on-rails-3.1

所以,我想我可能想出一些古怪的解决方案,但我想我也可以提前问。

每个用户可以拥有多个订单。
每张桌子都可以有很多订单。
每个订单最多有3个项目。

尝试设置,以便用户可以创建订单,订单会自动生成参考编号,每个项目都有一个参考字母。参考编号为0-99,一旦达到99就会循环回0,因此全天的订单很容易参考办公桌。

因此,用户下订单#2 of 3 items:
78A:红色订书机
78B:铅笔
78C:袋鼠脚

不确定这是在程序逻辑中完成还是以某种方式在SQL级别完成。

正在考虑类似neworder = order.last + 1的东西,并以某种方式将其绑定到订单创建的范围内。对细节非常模糊。

1 个答案:

答案 0 :(得分:0)

如果不知道上述评论的答案,我会假设您希望存储完整的审核,而不是擦除历史记录;因此78A 78B 78C型订单只是一种显示格式。

如果您有一个Order表(包含OrderId,UserId,DeskId,时间和任何其他顶级东西)和OrderItem表(包含OrderItemId,OrderId,LineItemId - 显示1,2或3为您的订单中的第一个和第二个和第三个订单项,以及ProductId)和Product表(ProductId,Name,Description)

然后这很简单(谢天谢地)使用模运算符,它给出了除法的余数,在这种情况下允许你以3和100(或你想要的任何其他数字)的组计数。 只需执行以下操作: (您将要将这些项目加入到一个列中,我只是将它们保持不同,以便您可以看到它们是如何工作的) 显然,在适当的情况下加入/查询/过滤用户,桌面和产品表

select
o.OrderId,
o.UserId,
o.DeskId
o.OrderId%100 + 1 as OrderNumber, 
case when LineItem%3 = 1 then 'A'
 when LineItem%3 = 2 then 'B'
 when LineItem%3 = 0 then 'C'
end as ItemLetter,
oi.ProductId
from tb_Order o inner join tb_OrderItem oi on o.OrderId=oi.OrderId

或者,您可以将itemLetter(A,B,C)和/或OrderNumber(1-100)作为计算(和持久)列添加到表本身,以便在插入时计算一次,而不是选择它们时重新计算/格式化。 这种打破了一些最佳实践,您可以将原始数据存储在数据库中,并在格式化检索时进行格式化;但是如果你不打算更新数据,那么你要选择的数据超过你要写的数据;那么我会打破这个规则并在插入时计算你的格式