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

时间:2016-01-04 20:24:07

标签: mysql database sorting

我需要根据从ajax调用获取的数组列表中的主键值序列来更新排序顺序列。例如,我有2个coulmns(ID,Sortorder),其值为(23,1)(32,2)(21,3)(43,4),现在来自前端的用户移动第三行(21,3)第二行(32,2),我得到ID数组序列为23,21,32,43,我必须维护。从这个列表中,我试图按照序列更新sororder,因此数据库表值应该看起来像(23,1)(32, 3 )(21, 2 )(43,4)。你能帮我拿到这个DB更新声明。

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

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
    }

2 个答案:

答案 0 :(得分:0)

对于您展示的特定用例,您可以使用以下查询,该查询仅更新id=32id=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子句,以说明您可以轻松地将其调整为不同的用例。

答案 1 :(得分:0)

这是您可以做的:

DELIMITER $$
CREATE PROCEDURE `sp_update_positions`(
    IN `p_positions` VARCHAR(255)
)
BEGIN

    SET @positions = REPLACE(p_positions, ',', '),(');
    SET @positions = CONCAT('(', @positions, ')');

    DROP TEMPORARY TABLE IF EXISTS tmpPositions;

    CREATE TEMPORARY TABLE tmpPositions(
        `position` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `order_id` int(10) unsigned NOT NULL
    );

    SET @insertString = CONCAT('INSERT INTO tmpPositions (`order_id`) VALUES ', @positions);

    PREPARE insertStatement FROM @insertString;
    EXECUTE insertStatement;
    DEALLOCATE PREPARE insertStatement;

    UPDATE orders
    INNER JOIN tmpPositions ON order_id = orders.id
    SET orders.Sortorder = tmpPositions.position;

    SELECT ROW_COUNT() AS rowCount;

END$$
DELIMITER ;

然后您这样称呼它:

CALL sp_update_positions('24,23,21,22');