C# SQL表中位置管理算法

C# SQL表中位置管理算法,c#,sql,algorithm,C#,Sql,Algorithm,我有一个小疑问,如何管理以下情况。 在DB表中,我将相关数据保存在不同的列中,最后我将准确的顺序保存在名为position的列中。 此表已绑定到网格。现在,我正在实现将更改行位置的功能,但是我仍然需要更新数据库。我在问,实现这一目标的最佳实践或最便捷的方式是什么 欢迎您的建议 范例 姓名位置 abc 1 def 2 ghj 3 现在,我点击按钮,我得到以下信息 姓名位置 def 1 abc 2 ghj 3 我希望我已经解释过了 根据评论,这是一个真实的例子: 表1有三列ID1、ID2和位置 ID

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

欢迎您的建议

范例

姓名位置

abc 1

def 2

ghj 3

现在,我点击按钮,我得到以下信息

姓名位置

def 1

abc 2

ghj 3

我希望我已经解释过了

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

表1有三列ID1、ID2和位置
ID1和ID2是FK,表中有一个基于ID1和ID2的PK
当我选择要显示的数据时,我使用以下查询 从ID1=ID1上的表2内部联接表1中选择名称等,其中ID2=511 按职位排序

现在我需要更改两个元素的位置,以便表1中的行 例如,311511,5需要变为311511,4,而433511,4的行需要 成为433511,5。恰恰相反

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


干杯

我会创建一个表来保存结果,在我的示例/解决方案中,要保存的表称为“梯形图”,数据来自“数据”,它限制了前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";

我会创建一个表来保存结果,在我的示例/解决方案中,要保存的表称为“梯形图”,数据来自“数据”,它限制了前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";
当您说:“将位置更改为行”时,您的意思是在表格中上下移动行(相对于
位置
顺序)

如果是这样,要向上移动该行,需要将
位置
与上一行交换。要向下移动,需要对下一行执行相同的操作。根据您特定的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

顺便说一句,即使在
位置上有唯一的约束(在Oracle下确认),这也应该有效

要了解更多信息,请查看。

当您说:“将位置更改为行”时,您的意思是在表格中上下移动行(相对于
位置
排序)

如果是这样,要向上移动该行,需要将
位置
与上一行交换。要向下移动,需要对下一行执行相同的操作。根据您特定的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

顺便说一句,即使在
位置上有唯一的约束(在Oracle下确认),这也应该有效


如需了解更多信息,请查看。

是否要在一次中只重新排列两行?或者更多?您的按钮只是在网格中向上或向下移动一个项目(基本上改变了它与邻居的位置)?您应该在每次发生更改时更新还是仅在“保存”按钮上更新?每次更改位置时,我都应该更新数据库并重新绑定网格。这就是我的想法。如果你有更好的建议,请随时提出。谢谢我不知道您使用的是什么网格,但是如果它确实绑定到一个记录集,那么当您更改记录集中的数据时,它不会重新排序吗?我仍然需要在重新绑定数据之前更新数据,并且为了更新数据,我需要找到一种正确更新数据库的方法。因此,如果用户单击了第5行中的“向上”按钮,数据库中的数据应该以如下方式更改:位置列值为5的行更改为4,值为4的行更改为5。是否有任何方便的方法来执行此操作,或者我应该对当前位置值使用“蛮力”检查,选择选择值为负1的元素,在值为正1时更新它,并通过减去它来更改所选元素的位置值?您想一次只重新排序两行吗?或者更多?您的按钮只是在网格中向上或向下移动一个项目(基本上改变了它与邻居的位置)?您应该在每次发生更改时更新还是仅在“保存”按钮上更新?每次更改位置时,我都应该更新数据库并重新绑定网格。这就是我的想法。如果你有更好的建议,请随时提出。谢谢我不知道您使用的是什么网格,但是如果它确实绑定到一个记录集,那么当您更改记录集中的数据时,它不会重新排序吗?我仍然需要在重新绑定数据之前更新数据,并且为了更新数据,我需要找到一种正确更新数据库的方法。因此,如果用户单击了第5行中的“向上”按钮,数据库中的数据应该以如下方式更改:位置列值为5的行更改为4,值为4的行更改为5。是否有任何方便的方法来执行此操作,或者我应该只使用“暴力”检查当前位置值,选择选择值为负1的元素,在值为正1时更新它,并通过减去它来更改所选元素的位置值?