使用PHP的MySQL中完全任意的排序顺序


Completely arbitrary sort order in MySQL with PHP

我在MySQL中有一个表,我正在从PHP访问它。例如,让我们有一个名为THINGS:的表

things.ID-int主键

things.name-varchar

things.owner_ID-int用于与另一个表连接

我选择的语句可能看起来像:

从owner_ID=99的事物中选择*;

相当简单。现在,我希望用户能够为这个查询返回的项目指定一个完全任意的顺序。将显示列表,然后他们可以单击行旁边的"向上"或"向下"按钮,并将其在列表中向上或向下移动,或者可能通过拖放操作将其移动到其他任何位置。我希望将此订单保存在数据库中(相同或其他表)。对于每个owner_ID的一组行,自定义顺序将是唯一的。

我一直在寻找提供这种订购的方法,但没有运气。我想了几种方法来实现这一点,但请帮我填写最后一个选项:

  1. 添加一个INT列,并将其值设置为获取行所需的值按我的顺序返回。这就出现了扫描问题逐行查找插入点,并且可能需要更新前/后行排序列
  2. 有一个"下一个"answers"上一个"列,实现一个链表。一旦我找到我的位置,我只需要更新最多2行即可插入行。但这需要扫描第1行中的位置
  3. 一些我不知道的SQL/关系数据库技巧

我正在寻找#3的答案,因为它可能就在那里,谁知道呢。另外,我想尽可能多地卸载数据库。

根据我所读到的内容,您需要一个包含每个用户排序的新表,比如说它被称为*user_orderings*。

这个表应该包含用户ID、事物的位置和事物的ID。(user_id,thing_id)应该是PK。这样,你每次都需要更新这个表,但你可以在user_orderings表上使用order BY并将其与things表连接,按照用户想要的顺序为他/她获取东西。它应该起作用。

有序列表的最简单表达式是:3,1,2,4。我们可以将其作为字符串存储在父表中;因此,如果我们的表是具有外键profile_idphotos,我们将在profiles.photo_order中下照片订单。然后,我们可以利用find_in_set()函数在order by子句中考虑这个字段。这需要两个查询或一个联接。我使用了两个查询,但连接更有趣,所以它是:

select photos.photo_id, photos.caption
from photos
    join profiles on profiles.profile_id = photos.profile_id
where photos.profile_id = 1
order by find_in_set(photos.photo_id, profiles.photo_order);

请注意,由于性能问题,您可能不希望在where子句中使用find_in_set(),但在order by子句中,几乎没有足够的结果可以快速使用。