我在MySQL中有一个'用户'表
当用户登录我的应用程序时,他们可以看到所有其他用户的列表,并通过一些javascript-drag-drop可以安排其他用户出现的顺序。我们要保存该订单。
并将其保存到记录中(即'order_pref'= 4,3,5,23 ...按照指定的顺序列出user_ids列表。)
所以这很好但是在显示时..有一种简单的方法我可以使用一个查询基于这个以逗号分隔的user_id列表进行排序吗?
答案 0 :(得分:0)
你不能在MySQL中。可以想象你可以用PHP,但这不是模拟这个问题的最好方法。
您应该分配订单号,然后按顺序排序,而不是按固定顺序存储ID。假设:
你存储:
UserID OrderNum UserDisplay
302 100 11
302 200 432
302 300 788
302 400 343
然后问题就变成了:
SELECT UserDisplay
FROM UserOrder
WHERE UserID = 302
ORDER BY OrderNum
很多更简单。现在更改订单需要更新OrderNum
字段。这就是为什么我没有做步骤1.相反,我做了100步,所以如果你想将343移动到第二位,只需将OrderNum
设置为150.你可以做更大的间隔(例如1000000)和可能需要偶尔重新编号这些值。
答案 1 :(得分:0)
有几种方法可以做到这一点,最好的情况是使用第二个表进行用户特定的排序。将单个列添加到User表将不起作用,因为可能每个用户都有自己的排序。
根据应用程序的规模和复杂程度,您可以使用单个表(更多可管理,但数百万用户更慢)或为每个用户创建表(更具可伸缩性)。在以下示例中,当前用户是用户#2,排序是4,3,5,23。
create table if not exists user_ordering (
owner_id integer unsigned not null,
user_id integer unsigned not null,
order_index integer not null default '0',
unique owner_user (user_id,owner_id),
index owner_idx (owner_id,order_index)
) ENGINE=MyISAM;
要保存订单,请按顺序插入:
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,4,0);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,3,1);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,5,2);
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,23,3);
要选择,只需为不在列表中的用户加入并使用“默认”排序:
SELECT U.* FROM user U
LEFT OUTER JOIN user_ordering G ON U.id=G.user_id AND G.owner_id=2
ORDER BY G.order_index,U.name;
如果您想节省一些时间,可以使用自动递增的双主键,以便在“逐个所有者”的基础上进行递增,例如
create table if not exists user_ordering (
owner_id integer unsigned not null,
user_id integer unsigned not null,
order_index integer not null AUTO_INCREMENT,
unique owner_user (user_id,owner_id),
PRIMARY KEY (owner_id,order_index)
) ENGINE=MyISAM;
如果给你一个要更新的列表,你可以快速做到:
DELETE FROM user_ordering WHERE owner_id=2;
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,3);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,5);
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,23);
您甚至可以使用多插入版本:
DELETE FROM user_ordering WHERE owner_id=2;
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4),(2,3),(2,5),(2,23);
对于海量数据库,您可以更好地为每个用户创建一个表,例如:
create table if not exists user_ordering_2 (
user_id integer unsigned not null,
order_index integer not null AUTO_INCREMENT,
unique owner_user (user_id),
PRIMARY KEY (order_index)
) ENGINE=MyISAM;
这需要一些更高级的工具来保持您的架构最新,但它可以更好地扩展。