是否可以重新排序SQL数据库中的行?例如; 如何交换第2行和第3行的值?
行的顺序对我很重要,因为我需要根据顺序显示值.
感谢所有的答案.但'Order by'对我不起作用.
例如,我在数据库中放置了一个书签列表.我想根据查询得到的结果进行显示.(不按字母顺序排列).就在插入它们的时候.
但是用户可以重新排列书签的位置(以他/她想要的任何方式).所以我不能使用'order by'.
一个例子是如何在firefox中的书签中显示书签.用户可以轻松切换位置.我怎么能在DB中提到它?
谢谢.
Mik*_*wis 71
听起来你需要像"ListOrder"这样的另一个专栏.所以你的表可能看起来像:
BookMark ListOrder
======== =========
d 1
g 2
b 3
f 4
a 5
Run Code Online (Sandbox Code Playgroud)
然后你可以"按订单"ListOrder.
Select * from MyTable Order By ListOrder
Run Code Online (Sandbox Code Playgroud)
如果用户一次只能移动一个书签,则可以使用整数作为ListOrder,并交换它们.例如,如果用户想要将"f"向上移动一行:
Update MyTable
Set ListOrder=ListOrder+1
Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f')
Update MyTable
Set ListOrder=ListOrder-1
Where BookMark='f'
Run Code Online (Sandbox Code Playgroud)
如果用户可以一次向上或向下移动多个行,那么您需要重新排序一个段.例如,如果用户想要将"f"移动到列表顶部,则需要:
update MyTable
Set ListOrder=ListOrder+1
where ListOrder>=1 -- The New position
and ListOrder <(Select ListOrder from MyTable where BookMark='f')
update MyTable
Set ListOrder=1 -- The New Position
Where Bookmark='f'
Run Code Online (Sandbox Code Playgroud)
Joh*_*ant 20
正如其他人所提到的,依赖数据库表的物理顺序并不是一个好主意.关系表在概念上更像是无序集而不是有序列表.假设某种物理秩序可能导致不可预测的结果.
听起来你需要的是一个单独的列,用于存储用户首选的排序顺序.但是您仍然需要在查询中执行某些操作以按顺序显示结果.
可以通过创建聚簇索引来指定数据库中记录的物理顺序,但这不是您希望在任意用户指定的基础上执行的操作.它可能仍会导致意想不到的结果.
ORDER BY
在您的SELECT
查询中使用.例如,要按用户的姓氏排序,请使用:
SELECT * FROM User ORDER BY LastName
Run Code Online (Sandbox Code Playgroud)
虽然有点晚了,但如果有人仍在寻找这个问题的答案,您需要使用 Stern-Brocot 技术。
对于每个项目,您需要存储分子和分母。然后您还可以添加一个计算列,它是两者的除法。每次您在另外两个项目之间移动一个项目时,该项目的分子就会变成两个相邻分子的总和,而该项目的分母就会变成两个相邻分母的总和。
这些数字不会像使用“平均”方法那样迅速飙升,在“平均”方法中,在 17 次交换后您将失去所有准确性。
我还创建了一个实现该方法的演示。
数据库可以以任何他们想要的方式存储数据。使用“order by”子句是保证数据排序的唯一方法。在您的书签示例中,您可以有一个指示排序的整数字段,然后在用户移动事物时更新该字段。然后按该列排序以按正确的顺序排列。