Php 列表更新-行冲突

Php 列表更新-行冲突,php,mysql,Php,Mysql,我有一个名为list的列,在我的order by(在MYSQL查询中)中使用该列,列表中有数字:(例如1到20) 然后通过listASC使用MYSQL order输出此列表-但是,当我在后端使用Jquery拖放UI列表更新列表时,它应该更新列表前端 我的问题是,我的列表顺序有时会与其他行冲突,因为列表中可能有两行或三行的值为1。因此,当我的订单更新时,我想知道只有当这些行>=给定的订单号时,我才能通过+1更新其他行 我不想使列成为主要列,因为我不想使列表列唯一,原因是有多个类别-每个类别中都从1

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

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

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

我不想使列成为主要列,因为我不想使
列表
列唯一,原因是有多个类别-每个类别中都从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());
?>

@andrewsi是正确的,特别是我建议
按列表顺序更新ASC,last_update DESC
,因此在更新
列表的同一查询中,您可以为
上次更新添加时间戳,因此您无需使用触发器或任何其他更新。

@andrewsi是正确的,特别是我建议
按列表顺序更新ASC,last_update DESC
因此,在更新
列表的同一查询中,您可以为
last_update
添加时间戳,因此无需使用触发器或任何其他更新。

一般来说,andrewsi和Luis建议的是正确的。而不是(如安德烈斯所说)“做杂乱的更新”,你应该真正考虑通过第二列排序。 不过,我可能明白你的观点。我知道它可能适用于CMS中的一种类似情况,即通过在项目旁边的文本字段中手动更改订单号,让后端用户订购项目,例如

item 1 - [ 1 ]
item 2 - [ 3 ]
item 3 - [ 2 ]
。。。
[]
中的数字将是新订单

因此,一个相当混乱的解决方案是(很多步骤,但如果您不必担心性能,我不知道这对您来说是否合适):

然后作为第二步

SELECT id, list FROM projects WHERE cat=:cat ORDER BY list ASC, timestamp_inserted DESC
然后循环通过select和foreach行更新得到的数组(:i是递增索引)

PS:您必须添加带有时间戳值的列
timestamp\u inserted


PPS:为了清楚地说明,我不建议这样做,也从未说过这是最佳做法(对于那些考虑因此而否决投票的人来说)

一般来说,安德鲁斯和路易斯的建议是正确的。而不是(如安德烈斯所说)“做杂乱的更新”,你应该真正考虑通过第二列排序。 不过,我可能明白你的观点。我知道它可能适用于CMS中的一种类似情况,即通过在项目旁边的文本字段中手动更改订单号,让后端用户订购项目,例如

item 1 - [ 1 ]
item 2 - [ 3 ]
item 3 - [ 2 ]
。。。
[]
中的数字将是新订单

因此,一个相当混乱的解决方案是(很多步骤,但如果您不必担心性能,我不知道这对您来说是否合适):

然后作为第二步

SELECT id, list FROM projects WHERE cat=:cat ORDER BY list ASC, timestamp_inserted DESC
然后循环通过select和foreach行更新得到的数组(:i是递增索引)

PS:您必须添加带有时间戳值的列
timestamp\u inserted


PPS:为了清楚地说明,我不建议这样做,也从来没有说过这是最佳做法(对于那些考虑因此否决投票的人来说)

在您的ORDER BY条款中添加第二个标准不是更容易吗<代码>按列表ASC、类别ASC排序
?按类别排序会有什么区别?-原因列表是这样的,项目可以被定制地放在一个页面上-这意味着他们可以在一天订购1(前端),第二天订购5(前端)。。我只需要订购列表,因为管理员/项目经理已在后端拖动列表以匹配前端。。。这需要我更新
list
,当有多个时,它通常会按项目名称更新ASC-这可能不是它在后端的放置方式..我的观点是,您可以向ORDER by添加额外的列,因此如果您的
list
列有3行,值为1,然后可以根据第二列的值进行排序。它避免了繁琐的更新。如果这不是你想要的,我可以请你在你的问题中添加一个实际的例子吗,因为我已经读了上面的六遍了,我无法理解。在你的ORDER BY子句中添加第二个标准不是更容易吗<代码>按列表ASC、类别ASC排序
?按类别排序会有什么区别?-原因列表是这样的,项目可以被定制地放在一个页面上-这意味着他们可以在一天订购1(前端),第二天订购5(前端)。。我只需要订购列表,因为管理员/项目经理已在后端拖动列表以匹配前端。。。这需要我更新
list
,当有多个时,它通常会按项目名称更新ASC-这可能不是它在后端的放置方式..我的观点是,您可以向ORDER by添加额外的列,因此如果您的
list
列有3行,值为1,然后可以根据第二列的值进行排序。它避免了繁琐的更新。如果这不是你想要的,我可以请你在你的问题中添加一个实际的例子吗,因为我已经读了上面的六遍了,我无法理解它。这个选项不是很好,但它可以。thk,这是简单的方法不是很好