【问题标题】:List Update - row conflict列表更新 - 行冲突
【发布时间】:2012-08-09 18:57:44
【问题描述】:

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

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

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

我不想将列设为主要列,因为我的目标不是使 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 更新该类别中的所有行

【问题讨论】:

  • 在您的 ORDER BY 子句中添加第二个条件不是更容易吗? ORDER BY list ASC, category ASC?
  • 按类别排序会有什么不同? - 存在原因列表以便项目可以自定义放置在页面上 - 这意味着它们可以在一天订购 1(前端),然后订购 5(前端)。我只需要以管理员身份订购列表/项目经理已在后端拖动列表以匹配前端...这需要我更新list,当有多个时,它通常会按项目名称进行 ASC - 这可能不是它被放置在后端..
  • 我的意思是,您可以在 ORDER BY 中添加额外的列,这样如果您的 list 列有 3 行,值为 1,那么您可以对第二列的值进行排序.它避免了必须进行混乱的更新。如果这不是您所追求的,我可以请您在您的问题中添加一个实际示例,因为我已经阅读了上述六遍,我无法理解它。

标签: php mysql


【解决方案1】:

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

【讨论】:

  • 这个选项不是很好,但它会做。
  • thk,这是直截了当的方法
【解决方案2】:

总的来说,andrewsi 和 Luis 的建议是正确的。而不是(像 andrewsi 说的)“做混乱的更新”,你真的应该考虑按第二列排序。

不过,我或许能看出你的观点。我知道它可能适用的一种类似情况是在 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:明确说明,我不推荐这样做,也从未说过这是最佳做法(对于那些考虑因此而投票反对的人)

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2017-03-22
    • 2019-09-19
    • 2011-04-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多