我有一个名为ticket
的表,当用户从前端单击向上/向下按钮时,我想在其中交换两行。
为此,我添加了一个名为ticket_index的自动生成字段。但我无法执行此操作。
我写了以下查询
UPDATE ticket as ticket1
JOIN ticket as ticket2 ON (ticket1.ticket_index = 1 AND ticket2.ticket_index = 4)
OR (ticket1.ticket_index = 4 AND ticket2.ticket_index = 1)
SET
ticket1.ticket_index = ticket2.ticket_index,
ticket2.ticket_index = ticket1.ticket_index
任何人都可以给我正确的SQL查询吗?如果需要额外的信息,请告诉我。感谢
答案 0 :(得分:5)
使用案例陈述,例如:
update ticket
set ticket_index = case when ticket_index = :x then :y else :x end
where ticket_index in (:x, :y);
答案 1 :(得分:2)
由于您的ticket_index字段是一个标识(自动递增整数)字段,为什么您想要交换这些索引?基于您的问题,听起来您正在寻找的是一种管理排序顺序的方法,它应该真正独立于索引/主键。我知道这不能回答你的问题,但我的建议是添加一个单独的列来控制排序顺序。
答案 2 :(得分:0)
当然你只是更新了两行?
UPDATE ticket SET ticket_index = 4 WHERE ticket_id = 18
UPDATE ticket SET ticket_index = 5 WHERE ticket_id = 301
使用简短的交易来确保您更新两个记录。
答案 3 :(得分:0)
假设:您有一个订单栏(例如ticket_order)。
观察:使用ticket_order N向下移动票证与向ticket_order N + 1向上移动票证具有相同的效果,因此您只需要一个例程来交换两个元素(无论是向上还是向下移动)。
在这种情况下,我们创建一个“向下移动例程”,它只需要一个参数:要向下移动的票证的顺序。但是,您的最终查询可能需要更多参数来唯一标识要交换订单的两个故障单。例如,您可能需要添加故障单类别或其他任何内容。
此例程所需的(一)查询是(其中[order]是您要向下移动的票证的顺序):
UPDATE tickets
SET ticket_order = 2 * [order] - ticket_order + 1
WHERE ticket_order IN ([order], [order]+1)
(and possibly additional arguments here to further identify the tickets)