管理SQL表中位置的算法

我有一个小疑问,如何管理以下情况。 在数据库表中,我将相关数据保存在不同的列中,最后我将精确的顺序保存在名为position的列中。 此表绑定到网格。 现在我正在实现将更改行的位置的function,但我还需要更新数据库。 我问的是什么是最佳实践或最方便的方法来实现这一目标?

建议是值得欢迎的。

姓名职位

abc 1

def 2

ghj 3

现在我点击按钮,我得到以下内容

姓名职位

def 1

abc 2

ghj 3

我希望我已经解释过了自己!

根据评论,这是一个真实的例子:

TABLE1有3列ID1,ID2,POSITION
ID1和ID2是FK,表格具有基于ID1和ID2的PK
当我选择要显示的数据时,我使用以下查询SELECT NAME,ETC FROM TABLE2 INNER JOIN TABLE1 ON ID1 = ID1 WHERE ID2 = 511 ORDER BY POSITION

现在我需要更改两个元素的位置,因此TABLE1中的行(例如311,511,5)需要变为311,511,4,而行433,511,4的行需要变为433,511,5。 相反的。

我希望这有助于澄清我的问题。

干杯!

当你说: “将位置更改为行”时 ,是指在表格中上下移动行(相对于position排序)?

如果是这样,要向上移动该行,您需要将该position与前一行交换。 要将其向下移动,您需要对下一行执行相同操作。 根据您的特定SQL方言,从不同行交换值的语法可能类似于:

 UPDATE YOUR_TABLE SET position = CASE position WHEN 2 THEN 3 WHEN 3 THEN 2 END WHERE position IN (2, 3) 

此示例向上移动第3行,向下移动第2行。 根据您的需要更换2和3 ……

顺便说一句,即使在position上存在UNIQUE约束(在Oracle下确认),这也应该有效。

有关更多想法,您可以查看此问题 。

我创建了一个表来保存结果,在我的示例/解决方案中,要保存的表称为“梯形图”,数据来自“数据”,它受前100个条目的限制。 它首先清除表,然后将临时位置变量设置为0并开始增加/插入。

 "TRUNCATE `ladders`";SET @pos:=0; INSERT INTO `ladders` ( `identifier`,`pos`,`score`)" " SELECT `id` , @pos := @pos + 1 , `thescore`" " FROM `data` ORDER BY `thescore`" " DESC LIMIT 100";