列表更新 - 行冲突

时间:2012-08-09 18:57:45

标签: php mysql

我有一个名为list的列,在我的订单中使用(在MYSQL查询中),在列表中是数字:(例如1到20)

然后使用list ASC的MYSQL顺序输出此列表 - 但是,当我使用Jquery拖放UI列表在后端更新我的列表时,它应该更新列表前端。

我的问题是我的列表顺序有时会与其他行冲突,因为列表中可能有两行或三行值为1因此当我的订单更新时我想知道如何更新其他行+1 strong>仅当行是> =给定的订单号

我不想让列成为主要列,因为我的目标不是使list列唯一,原因是因为有多个类别 - 并且在每个类别中它们都从1开始 - 因此,如果我将其设为唯一,则会导致错误,因为在不同的类别中有多个1。

我问过一位朋友,他说我可能会尝试使用触发器功能PL / SQL,但这对我来说是个新的理由 - 我不完全理解这种语言,并且想知道是否有人可以帮助我做我想做的事情使用MYSQL甚至是PL / SQL。

这是我到目前为止所拥有的:

<?php
$project = mysql_real_escape_string(stripslashes($_POST['pid']));
$category = mysql_real_escape_string(stripslashes($_POST['cat']));
$order = mysql_real_escape_string(stripslashes($_POST['order']));
// need to do update the moved result (list row) and update all conflicting rows by 1
mysql_query("UPDATE `projects` SET `cat`='$category',`list`='$order' WHERE `id`='$project'")or die(mysql_query());
?>

结论:

我正在尝试更新无唯一列,以便为该单个类别添加唯一值。我不知道如何更新该类别中的所有行+1

2 个答案:

答案 0 :(得分:2)

@andrewsi是对的,特别是我建议order by list ASC, last_update DESC所以在您更新list的同一查询中,您可以为last_update添加时间戳,因此您无需使用触发器或任何触发器其他更新。

答案 1 :(得分:2)

总的来说,安德鲁斯和路易斯的建议是正确的。而不是(像安德鲁斯所说)“做凌乱的更新”,你应该考虑通过第二列进行排序。

但是,我可以看到你的观点。我知道它可以应用的类似情况是在CMS中,您可以通过在项目旁边的文本字段中手动更改订单号来让后端用户订购商品,例如

item 1 - [ 1 ]
item 2 - [ 3 ]
item 3 - [ 2 ]

... []中的数字将成为新订单。

所以,一个非常混乱的解决方案(很多步骤,但如果你不必担心性能,那么对你来说可能没关系,我不知道):

INSERT INTO projects (cat, list, timestamp_inserted) VALUES (:cat, :list, NOW())

然后作为第二步

SELECT id, list FROM projects WHERE cat=:cat ORDER BY list ASC, timestamp_inserted DESC

然后遍历从select和foreach行更新获得的数组(:i是增加的索引)

UPDATE projects SET list=:i WHERE id=:id

PS:你必须添加一个带有时间戳值的列timestamp_inserted
PPS:要明确说明,我不会推荐这个,也从不说这是最佳做法(对于那些考虑因此而投票的人)