Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据ID列表对记录进行具体排序?使用MySQL和PHP_Php_Mysql - Fatal编程技术网

根据ID列表对记录进行具体排序?使用MySQL和PHP

根据ID列表对记录进行具体排序?使用MySQL和PHP,php,mysql,Php,Mysql,我在MySQL中有一个“用户”表 当用户登录到我的应用程序时,他们可以看到所有其他用户的列表,并且通过一些javascript拖放可以安排其他用户出现的顺序。我们想保存那个订单 并保存到他们的记录中,即“order_pref”=4,3,5,23。。。按指定顺序排列的用户ID列表 这很好,但说到展示。。有没有一种简单的方法可以根据这个逗号分隔的用户ID列表进行排序,只需使用一个查询?在MySQL中无法进行排序。可以想象,您可以在PHP中使用它,但这不是建模此问题的最佳方法 您应该分配一个订单号,然

我在MySQL中有一个“用户”表

当用户登录到我的应用程序时,他们可以看到所有其他用户的列表,并且通过一些javascript拖放可以安排其他用户出现的顺序。我们想保存那个订单

并保存到他们的记录中,即“order_pref”=4,3,5,23。。。按指定顺序排列的用户ID列表


这很好,但说到展示。。有没有一种简单的方法可以根据这个逗号分隔的用户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;
这需要一些更高级的工具来保持模式的最新,但它可以更好地扩展