我需要根据从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更新声明。
附上打印屏幕以便更好地理解:
我有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
}
答案 0 :(得分:0)
对于您展示的特定用例,您可以使用以下查询,该查询仅更新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子句,以说明您可以轻松地将其调整为不同的用例。
答案 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');