如何将用户排序的数据存储在MySQL数据库中?

时间:2014-06-03 05:41:42

标签: mysql sql

在特定应用程序中,用户可以将小部件存储在收藏夹列表中。用户和小部件每个都有自己的ID,因此我设计了一个Favorites表来存储用户'收藏夹中:

+-----------+------------------+
|   Field   |       Type       |
+-----------+------------------+
| userid    | int(11) unsigned |
| widgetid  | int(11) unsigned |
| dateadded | int(11) unsigned |
+-----------+------------------+

这一切都很好,但现在我希望用户能够在他们的收藏夹中手动重新排序小部件。突然,dateadded列无益,因为更新它只会让用户将小部件碰到列表的前面。

因此,我似乎需要一个索引列:

+-----------+------------------+
|   Field   |       Type       |
+-----------+------------------+
| userid    | int(11) unsigned |
| widgetid  | int(11) unsigned |
| index     | int(11) unsigned |
+-----------+------------------+

这样,为了重新排序列,我可以像数组一样操作数据库表 - 拉出一行,将其他数据重新编号为" free"一个插槽,然后重新插入该行。例如,要将索引13处的对象移动到索引5,我会执行以下操作:

SELECT * FROM Favorites WHERE `index` = 13;
DELETE * FROM Favorites WHERE `index` = 13;

UPDATE Favorites
SET `index` = `index` + 1
WHERE `index` >= 5 AND `index` < 13;

INSERT INTO Favorites (userid, widgetid, index) VALUES (<data from select>, 5);

然而,这感觉非常hacky,非常非SQL,我无法想象表现会很棒。

什么是&#34;适当的&#34;将任意可重新排序的数据存储在MySQL数据库中的解决方案?

1 个答案:

答案 0 :(得分:1)

我会使用一些步骤的索引值,例如10,20,30,40。

然后,当我想将索引40移动到10到20之间时,我首先将索引更新为15,其中index = 40。然后根据下面的选择再次更新所有用户的记录,再次恢复10,20,30,40个订单。

select f.*, 
       @new_index:=@new_index+10 as new_index
from Favorites f, (select @new_index:=0) as sess_var
where f.user_id=:theUserId
order by f.index

查询将返回包含索引新值的所有旧记录。调整它以便在第二次更新时使用。

更新:

update Favorites f
      join (the query above) sub on
    f.user_id = sub.user_id and f.widget_id= sub.widget_id
set index=sub.new_index