我在MySQL中有一个表,我可以从PHP访问。例如,让我们有一个名为THINGS的表:
things.ID - int主键
things.name - varchar
things.owner_ID - 用于加入另一个表的int
我的选择语句可以获得我需要的内容:
SELECT * FROM things WHERE owner_ID = 99;
非常简单。现在,我希望用户能够为从此查询返回的项目指定完全任意的顺序。将显示该列表,然后他们可以单击" up"或" down"按钮旁边的按钮,让它在列表中向上或向下移动,或者可能是拖放操作以将其移动到其他任何位置。我希望将此订单保存在数据库(相同或其他表格)中。对于每个owner_ID,自定义顺序对于行集是唯一的。
我已经搜索了如何在没有运气的情况下提供此订购的方法。我已经想到了实现这一目标的几种方法,但请帮助我填写最终选项:
我正在寻找#3的答案,因为它可能在那里,谁知道。另外,我想尽可能多地卸载数据库。
答案 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
子句中,几乎没有足够的结果可以快速实现。
这些信息在您的数据库中很容易更新,因为系统中的某个位置您的用户界面必须知道照片顺序,如果数据库中不存在任何订单,则会回退到某些默认值。因此无论接口决定什么,只要用户更改它,您就需要让它向该服务器发送一个请求。