【问题标题】:Path enumeration counter路径枚举计数器
【发布时间】:2013-12-14 22:22:46
【问题描述】:

我的网站有一个评论系统,cmet 存储在一个表格中,如下所示:

post_id |  path  | total_replies
   1        1/          3
   2       1/2/         2
   3      1/2/3/        1
   4     1/2/3/4/       0

换句话说,post id 2是对post id 1的回复,post id 3是对post id的回复2 是对 post id 1 等的回复。它实际上只是一条路径。

post id 1 的 total_replies 列是 3,因为它有 3 个回复(post id 2、3 和 4),其他行使用相同的逻辑.

因为这是一个评论系统,每次发表新评论时都会添加更多行。我正在尝试做的是找到一种方法来在每次创建新列时增加 total_replies 列。

因此,例如,如果有人对 post id 2 进行了新回复(post id 5),表格将如下所示:

post_id |  path  | total_replies
   1        1/          4 (this was incremented)
   2       1/2/         3 (this was incremented)
   3      1/2/3/        1
   4     1/2/3/4/       0
   5      1/2/5/        0

所以,我的问题是,每次做出新回复时,我将如何进行递增?

编辑:我当前的查询。

$stmt = $cxn->prepare("UPDATE posts SET total_replies = total_replies+1 WHERE ? LIKE concat(?, '%') AND post_path != ?");
$stmt->bind_param('sss', $new_path, $path, $new_path);
$stmt->execute();

【问题讨论】:

标签: mysql hierarchy hierarchical-data


【解决方案1】:

你可以用updatewhere子句做你想做的事:

update comments
    set total_replies = total_replies + 1
    where NEWPATH like concat(path, '%');

在这种情况下,NEWPATH 将是 '1/2/5/'。目前尚不清楚您是在变量中还是仅作为表中的新行。这假设您将其作为变量。

编辑:

如果您不想更新原始记录:

update comments
    set total_replies = total_replies + 1
    where NEWPATH like concat(path, '%') and NEWPATH <> path;

【讨论】:

  • 但是,问题是我正在增加与新路径相关的所有路径的 total_replies 计数。例如,我们刚刚添加了1/2/5/。这将增加1/2/1/ 的total_replies,因为它们都是彼此下的回复(5 是对2 的回复,也是对1 的回复)。这是否意味着需要一个循环来遍历数值 1/2/ 并像这样递增它们?
  • 声明将更新'1/''1/2/''1/2/5'作为一个声明。要消除最后一次更新,请在 where 子句中添加 ` 和 path NEWPATH`。
  • 添加`和是什么意思?我不熟悉更复杂的查询。
  • 我实际上还发现了另一个问题。假设我们正在回复以下路径:1/2/(新回复的 id 将是 4)。这意味着新路径将是1/2/4/。但是,如果数据库中存在路径 1/2/3/,您的查询也会增加该行的总回复数。相反,它应该只更新1/2/1/2/4/
  • @Bagwell 。 . .在这种情况下,查询不会增加 '1/2/3'
猜你喜欢
  • 1970-01-01
  • 2014-04-27
  • 2020-12-20
  • 2012-09-02
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多