mysql - 根据数组值列表更新数据库排序列

标签 mysql database sorting

我需要根据从 ajax 调用中作为数组列表获得的主键值序列更新排序顺序列。例如,我有 2 个具有值 (23,1)(32,2)(21,3)(43,4) 的列(ID,Sortorder),现在来自前端的用户移动上面的第 3 行(21,3)第二行(32,2),我得到的 ID 数组序列为 23、21、32、43,我必须维护它。从此列表中,我尝试根据顺序更新排序顺序,因此数据库表值应显示为 (23,1)(32,3)(21,2)(43,4)。你能帮我得到这个数据库更新声明吗。

附上打印屏幕以便更好地理解:

Screenshot

我有 Java 逻辑,试图找到更新 sql 语句以从数组列表中循环。我的表中有大约 1000 行,根据我的逻辑,这将触发 1000 个更新查询,我认为这效率不高。试图找到一种替代的有效方法。

Connection conn = null;
    PreparedStatement pstmt = null;
    conn = getConnection();
    String query = "update Sortordertable set sortorder = ? where Id = ? ";
    pstmt = conn.prepareStatement(query); // create a statement

    String str[]=String.valueOf(s.getRecordId()).split(";");//id1;id;id3;.... list I get from ajax call
    for(int i=0;i<str.length();i++)
    {
        pstmt.setId(1,i++);  //set sortorder value as 1, 2, 3..
        pstmt.setInt(2, str[i]); // In this line I want to use my array-list to update my table.
        pstmt.executeUpdate(); // execute update statement
    }

最佳答案

对于您展示的特定用例,您可以使用以下查询,该查询将仅更新带有 id=32 的行或 id=23 .

UPDATE t1 SET 
  sortorder = CASE WHEN id = 32 THEN 3 ELSE 2 END
WHERE id IN   (32, 21);

如果您在每次操作后不更新数据库,这可以适用于多次更新。但会随着用户在触发更新前的操作次数而增长。

编辑以解决评论:

如果像您评论中给出的示例一样,您想要将顺序为 4 的行移动到第一行,您可以使用以下命令:

UPDATE t1 SET 
  sortorder = CASE WHEN sortorder = 4 THEN 1 ELSE sortorder + 1 END
WHERE sortorder <= 4;

我在最后一个查询中添加了一个 where 子句,以说明您可以轻松地使其适应不同的用例。

关于mysql - 根据数组值列表更新数据库排序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599223/

相关文章:

java - 是否有可能从 Google App Engine 托管的应用程序连接到 Amazon 托管的 MySQL 数据库?

c# - 在 C# 中从本地数据库中的单个列中检索数据

algorithm - 归并排序的变体

python - 如何在Python中实现快速排序

mysql - TIMESTAMP 到期时通知的最佳方式?

php - mySQL查询以计算发布到数据库的唯一用户数

mysql - 如何在 MySQL 中搜索组合(非空格)字符

database - 什么是 "opaque" key ?

database - 序列化隔离级别的实际用途?

javascript - 按浮点值对数组进行排序