根据ID列表对记录进行具体排序?使用MySQL和PHP
我在MySQL中有一个“用户”表 当用户登录到我的应用程序时,他们可以看到所有其他用户的列表,并且通过一些javascript拖放可以安排其他用户出现的顺序。我们想保存那个订单 并保存到他们的记录中,即“order_pref”=4,3,5,23。。。按指定顺序排列的用户ID列表根据ID列表对记录进行具体排序?使用MySQL和PHP,php,mysql,Php,Mysql,我在MySQL中有一个“用户”表 当用户登录到我的应用程序时,他们可以看到所有其他用户的列表,并且通过一些javascript拖放可以安排其他用户出现的顺序。我们想保存那个订单 并保存到他们的记录中,即“order_pref”=4,3,5,23。。。按指定顺序排列的用户ID列表 这很好,但说到展示。。有没有一种简单的方法可以根据这个逗号分隔的用户ID列表进行排序,只需使用一个查询?在MySQL中无法进行排序。可以想象,您可以在PHP中使用它,但这不是建模此问题的最佳方法 您应该分配一个订单号,然
这很好,但说到展示。。有没有一种简单的方法可以根据这个逗号分隔的用户ID列表进行排序,只需使用一个查询?在MySQL中无法进行排序。可以想象,您可以在PHP中使用它,但这不是建模此问题的最佳方法 您应该分配一个订单号,然后按该编号排序,而不是按固定顺序存储ID。假设: 登录的用户是302 用户ID列表是11432788343 您的店铺:
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,并且可能偶尔需要重新编号这些值。有几种方法可以做到这一点,最好是使用第二个表进行用户特定的排序。向用户表中添加一列将不起作用,因为假定每个用户都有自己的排序 根据应用程序的规模和复杂性,您可以使用一个更易于管理的表来实现这一点,但对于数百万用户来说速度较慢,或者为每个用户创建更具可伸缩性的表。在以下示例中,当前用户是用户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;
这需要一些更高级的工具来保持模式的最新,但它可以更好地扩展