使用PHP在MySQL中完全任意排序

时间:2012-03-02 00:56:25

标签: php mysql database sorting relational

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

  

things.ID - int主键

     

things.name - varchar

     

things.owner_ID - 用于加入另一个表的int

我的选择语句可以获得我需要的内容:

  

SELECT * FROM things WHERE owner_ID = 99;

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

我已经搜索了如何在没有运气的情况下提供此订购的方法。我已经想到了实现这一目标的几种方法,但请帮助我填写最终选项:

  1. 添加一个INT列并将其值设置为我需要获取行的任何值 按我的顺序退回。这就出现了扫描问题 逐行找到插入点,并可能需要 更新前面/后面的行排序列。
  2. 有一个" next"和"之前"列,实现链表。 一旦找到我的位置,我就必须更新最多2行才能插入 排。但这需要从第1行扫描位置。
  3. 一些SQL /关系数据库技巧我不知道......
  4. 我正在寻找#3的答案,因为它可能在那里,谁知道。另外,我想尽可能多地卸载数据库。

2 个答案:

答案 0 :(得分:2)

根据我的阅读,你需要一个包含每个用户排序的新表,比如它叫做* user_orderings *。

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

答案 1 :(得分:0)

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

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);

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

这些信息在您的数据库中很容易更新,因为系统中的某个位置您的用户界面必须知道照片顺序,如果数据库中不存在任何订单,则会回退到某些默认值。因此无论接口决定什么,只要用户更改它,您就需要让它向该服务器发送一个请求。