基于ID列表的记录的具体排序?使用MySQL& PHP

时间:2010-03-16 00:53:45

标签: php mysql

我在MySQL中有一个'用户'表

当用户登录我的应用程序时,他们可以看到所有其他用户的列表,并通过一些javascript-drag-drop可以安排其他用户出现的顺序。我们要保存该订单。

并将其保存到记录中(即'order_pref'= 4,3,5,23 ...按照指定的顺序列出user_ids列表。)

所以这很好但是在显示时..有一种简单的方法我可以使用一个查询基于这个以逗号分隔的user_id列表进行排序吗?

2 个答案:

答案 0 :(得分:0)

你不能在MySQL中。可以想象你可以用PHP,但这不是模拟这个问题的最好方法。

您应该分配订单号,然后按顺序排序,而不是按固定顺序存储ID。假设:

  • 登录用户为302
  • 用户ID列表为11,432,788,343

你存储:

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;

这需要一些更高级的工具来保持您的架构最新,但它可以更好地扩展。