Php 在优先级列中填充间隙+保持顺序
是否有任何好的算法可以填补优先级或表中任何其他列的空白? e、 g 实例 我有一个表,其结构如下所示: 例如,它是这样填充的Php 在优先级列中填充间隙+保持顺序,php,mysql,codeigniter,Php,Mysql,Codeigniter,是否有任何好的算法可以填补优先级或表中任何其他列的空白? e、 g 实例 我有一个表,其结构如下所示: 例如,它是这样填充的 1 | books | NULL | 1 2 | dvds | NULL | 2 5 | action | 2 | 1 8 | romantic | 2 | 2 9 | fantasy | 1 | 1 4 | sci-fi | 1 | 2 6 | comics | 1 | 3 在我的设计中,有一个更改子类别的选项
1 | books | NULL | 1
2 | dvds | NULL | 2
5 | action | 2 | 1
8 | romantic | 2 | 2
9 | fantasy | 1 | 1
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
在我的设计中,有一个更改子类别的选项,如果发生这种情况,优先级将设置为新优先级,并且它的值在它当前所在的子类别中是最高的。例如
将操作id:5子类别更改为books id:1,其优先级为4,这是可以的,但现在浪漫id:8行具有优先级2,并且它是子类别DVD id:2中唯一的一个
1 | books | NULL | 1
2 | dvds | NULL | 2
8 | romantic | 2 | 2
9 | fantasy | 1 | 1
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
5 | action | 1 | 4
->我将fantasy id:9子类别更改为DVD id:2,优先级为3
1 | books | NULL | 1
2 | dvds | NULL | 2
8 | romantic | 2 | 2
9 | fantasy | 2 | 3
4 | sci-fi | 1 | 2
6 | comics | 1 | 3
5 | action | 1 | 4
它是alrgit,但我需要一个函数,将重新排序的一切本身,所以我不必手动改变优先列的值。所以优先级列以1开头
间隙从id为8、4的行开始。
此外,改变漫画类别,然后改变回来,这将是所有的混乱将有正确的秩序,但它不会像我期待的行政目的好
有什么想法吗?伪代码或逻辑会更好
编辑-解决方案:伪代码+逻辑
因为我们知道类别中的行数,所以我们可以选择按优先级排序的行,这样我们就可以为每个新优先级分配正确的编号
e、 g:
有序选择返回的优先级如下:1、4、5、9、10
countselect=5
因此,新的优先事项必须如下:1、2、3、4、5。只需在foreach循环中为value分配新的键
由于其在codeigniter中:
$this->category_model->getPriorities2在我的案例2中按一个子类别的ASC顺序获取所有优先级
public function prioritize(){
$p = $this->category_model->getPriorities("2");
for ($i = 1; $i < count($p)+1; $i++) {
echo "new[".$i."]->id[".$p[$i-1]->id."]->old_value[".$p[$i-1]->priority."]<br>";
}
}
将表更新为tb1,将表设置为tb2.priority=tb2.priority-1,其中tb2.priority>tb1.priority和tb1.text='action'和tb2.subcategory=tb1.subcategory 这应该可以解决差距,每一个id较高的项目应该减少1 i、 e.您在该子类别中有:
| priority |
| 1 |
| 2 |
| 3 |
| 4 |
如果移动优先级为2的项目
3和4将作为2和3移动
附言:这只是解决差距的办法,因为搬家问题已经在另一个答案中解决了。它应该在移动之前完成,因为子类别将在移动之后更改,并且不会满足WHERE子句的要求,即从旧子类别中删除项目
关于随机间隙的重新排序:
假设我们有优先权:
5,10,11,12,18,20
我们希望将其制作为:
1,2,3,4,5,6
这里的最大数字是20,需要标记为6
完成后,最大数量将为18,即5
所以每次你使用更新。。。设置其中priority=MAXpriority,它将获得最大优先级
以下是我的简单测试:
<?php
for ($i = 6; $i>=1; $i--) {
echo "UPDATE table SET priority = $i WHERE priority = MAX(priority) AND subcategory = X;" . "<br/>";
}
?>
因此,您需要在选择子类别的位置进行选择,将其置于X而不是X,然后需要计算while循环的行数:
for ($i = $count_rows; $>=1; $i++) { ...
当然,您需要将语句放在正确的查询函数中,而不是重复它,但这是出于测试目的。我会尽力提供帮助,但首先我需要获得逻辑。优先权是做什么的?为什么在更改行动ot 4的优先权时,其子类别也会更改?或者,这是一种反向依赖关系,您正在更改子类别,使书籍和DVD成为类别?是的,正如您可以看到的,子类别是子类别列中每一行都有空值,优先级仅用于在站点菜单上排序。如果更改子类别,优先级将更改为新值:值=新子类别中的最高值优先级+1。我在这里发布的这张表是由我的表组成的,这张表更大一些,这张表解释了问题的目的这已经解决了,我试图找到解决办法来填补子类别变化过多造成的空白。正如你们在我的例子中看到的,在优先级列中有一个空白,浪漫的类别应该有优先级1而不是优先级2。我的意思是我可以手动改变它,但我需要一个算法,它可以自己完成这项工作。这就是你需要的:在的最后一个回复排序中的解决方案。非常好的便条谢谢。记住优先级列有它的用途,在任何更改之后,它必须有它的初始顺序!你提供的链接不是问题的解决方案,但它帮助很大。但你可以将其用于任何专栏。我知道我理解它,我正在寻找填补空白+保持订单。这就是问题的重点。很好,这应该是我的问题的一个解决方案,但让我们概括一下,如果有人希望算法填补空白,并且仍然具有相同的顺序,该怎么办?我的意思是暂时忘记改变类别和所有那些东西。这是没有必要的差距将只有1个数字更高。优先级可以是5、10、11、12、18、20,现在我想把它改为1、2、3、4、5、6:我知道你明白,但我正在寻找这个答案。用纯SQL来实现它可能需要一段时间。然而,我想到php中的SimpleFor循环,我会编辑答案,请参阅我的编辑;在codeigniter中也做了同样的事情。@Royal Bg:是的,不是
t关于sql及其与php的结合…尼斯:很高兴看到它对您来说一切正常,并希望新用户将其用作注释:
| priority |
| 1 |
| 2 |
| 3 |
| 4 |
<?php
for ($i = 6; $i>=1; $i--) {
echo "UPDATE table SET priority = $i WHERE priority = MAX(priority) AND subcategory = X;" . "<br/>";
}
?>
UPDATE table SET priority = 6 WHERE priority = MAX(priority) AND subcategory = X; // 20 becomes 6
UPDATE table SET priority = 5 WHERE priority = MAX(priority) AND subcategory = X; // 18 becomes 5
UPDATE table SET priority = 4 WHERE priority = MAX(priority) AND subcategory = X; // 12 becomes 4
UPDATE table SET priority = 3 WHERE priority = MAX(priority) AND subcategory = X; // 11 becomes 3
UPDATE table SET priority = 2 WHERE priority = MAX(priority) AND subcategory = X; // 10 becomes 2
UPDATE table SET priority = 1 WHERE priority = MAX(priority) AND subcategory = X; // 5 becomes 1
for ($i = $count_rows; $>=1; $i++) { ...