我需要能够让用户对数据进行排序。我拥有的架构是这样的:http://sqlfiddle.com/#!2/48100
我想在此表中添加一个排序列。 sort列应该是一个整数,每组giverUserId的值从1开始。但是,如果存在重复的giverUserId + receiverUserId组合,则它们必须保持相同的排序值。
因此,如果我的行A,B,C和D分别与giverUserId = 23和receiverUserId = 11,13,17和13,那么每行的排序值应为1,2,3, 2,分别。如果我用giverUserId = 23和receiverUserId = 13插入一个新行E,那么它的排序值也应该是2。通过这种方式,我可以通过在排序列上排序来检索具有特定顺序的结果集:A,B,D,E,C。尽管D和E都有更新的时间戳,但是因为排序而来到C之前列。
用户可以通过更新giverUserId = x和receiverUserId = y的所有行来修改行的排序值。我还会增加/减少因特定行的排序更改而错位的行。我得到了这个部分非常清楚。
我还没想到,是如何维护这样的排序列。我应该使用auto_increment,还是有一些其他特殊的MySQL可以帮助我完成我想要完成的事情?我需要弄清楚的是如何编写这样一个INSERT语句,它将插入一个sort =(排序列值,其中giverUserId = x AND receiverUserId = y)或MAX(排序列,其中giverUserId = x)。
我在后端使用JavaScript / Node.js和MySQL。
答案 0 :(得分:1)
这看起来很复杂。考虑添加新表,而不是处理此表中的新列:
create table CustomSortOrder (
giverUserId int,
receiverUserId int,
customOrder int
);
然后,您可以在以下查询中使用它:
select ugg.*
from user_generosity_gifts ugg left outer join
CustomSortOrder cso
on ugg.giverUserId = cso.giverUserId and
ugg.receiverUserId = cso.receiverUserId
order by giverUserId, coalesce(cso.customOrder, receiverUserId);
通过维护CustomSortOrder
表,您可以获得所需的所有灵活性。您可以在一个位置轻松更新给定接收方ID的顺序。我建议在giverUserId, receiverUserId
上设置索引以获得更好的性能。
答案 1 :(得分:0)
如上所述,这似乎过度思考(取决于您的身份证号码的大小)。
假设receiverUserId< 100000:
SELECT *
FROM user_generosity_gifts
ORDER BY giverUserId*100000 + receiverUserId;
这意味着您在插入或更新行时无需进行排序维护。
我可能误解了这个问题......