0

我需要能够让用户能够对他们的数据进行排序。我的架构是这样的:http ://sqlfiddle.com/#!2/48100

我想在此表中添加一个排序列。排序列应该是一个整数,对于每组 giverUserId,其值从 1 开始。但是,如果有重复的 giverUserId+receiverUserId 组合,它们必须保持相同的排序值。

因此,如果我有 A、B、C 和 D 行,其 giverUserId = 23 和 receiverUserId = 11、13、17 和 13,则每行的排序值应分别为 1、2、3、2 . 如果我插入一个新的 E 行,其中 giverUserId = 23 和 receiverUserId = 13,那么它的排序值也应该是 2。这样,我可以通过在排序列上进行排序来检索具有特定顺序的结果集:A、B、D、E、C。即使 D 和 E 都有更新的时间戳,由于排序,它在 C 之前柱子。

用户可以通过更新 giverUserId = x 和 receiverUserId = y 的所有行来修改行的排序值。我还将增加/减少因特定行的排序更改而错位的行。这部分我已经很清楚了。

我没有想到的是如何维护这样的排序列。我应该使用 auto_increment,还是有一些其他特殊的 MySQL 之类的东西可以帮助我完成我想要完成的事情?我需要弄清楚的是如何编写这样的 INSERT 语句,该语句将插入 sort = (sort column value where giverUserId=x AND receiverUserId=y) OR MAX(sort column where giverUserId=x)。

我在后端使用 JavaScript/Node.js 和 MySQL。

4

2 回答 2

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获得更好的性能。

于 2013-06-06T01:08:11.787 回答
0

如前所述,这似乎是多虑了(取决于你的身份证号码有多大)。

假设receiverUserId < 100000:

SELECT *
FROM user_generosity_gifts
ORDER BY giverUserId*100000 + receiverUserId;

这意味着您在插入或更新行时无需维护排序。

我可能误解了这个问题......

于 2016-07-14T09:02:23.107 回答