如何在产品之间保存自定义排序顺序?

时间:2017-09-14 14:05:28

标签: php mysql

我无法找到正确的答案!也许我不是在问正确的问题。

话虽这么说,我想添加从CMS自定义排序(重新排列)产品的功能。当我在产品列表页面的CMS中时,我希望能够按下UP或DOWN或将每个产品拖放到另一个产品之间。 e.g:

enter image description here

我有一张桌子上摆满了数以千计的产品,我想自定义它。

所以我的查询看起来像这样

SELECT id,product_name,price FROM products ORDER BY sort_order DESC;

首先,我必须将列sort_order添加到表中。我最初想的是用行id的完全相同的值填充它,但不是它是int(11)我会使用小数值。因此,如果我想在123123227123123225之间移动产品123123226,我会像这样计算新的sort_order:

$product_A_pos = 123123225.0;
$product_B_pos = 123123226.0;
$product_C_pos = 123123227.0;
$new_product_C_pos = ($product_A_pos + $product_B_pos)/2;
// I round it so it wouldn't be too big for the mysql column
$new_product_C_pos = round($new_product_C_pos, 5);

这一切都很棒,直到我进行测试,看看您可以在123123225123123226之间添加的最大产品数量,然后是the new inserted product123123226之间的最大数量并发现它只有16,直到你不能再插入它们之间。

使用此测试:

$old_product_C_sort_order = 0;
$product_A_sort_order = 123123225.0;
$product_B_sort_order = 123123226.0;
$product_C_sort_order = 123123227.0;
$new_product_C_sort_order = ($product_A_sort_order + $product_B_sort_order)/2;
$index = 0;
$epsilon = 0.00001;

while ($new_product_C_sort_order < $product_B_sort_order && $new_product_C_sort_order != $product_B_sort_order && !(abs($old_product_C_sort_order-$new_product_C_sort_order) < $epsilon)){
    $index++;
    $old_product_C_sort_order = $new_product_C_sort_order;
    $new_product_C_sort_order = ($new_product_C_sort_order + $product_B_sort_order)/2;
    $new_product_C_sort_order = round($new_product_C_sort_order, 10);
}
echo 'count: '.$index;
  

数:16

或者我应该在MySQL级别上这样做:

START TRANSACTION;

UPDATE products SET sort_order = sort_order + 1 WHERE sort_order >= 123123226 order by sort_order;

DELETE FROM products where id = 123123227;
INSERT INTO products (id,product_name,price) VALUES (123123227, 'C', 123123226);

COMMIT;

确保sort_order为int(11)。或者这是个坏主意?

有没有更好的解决方案来解决这个问题?我应该采用完全不同的方式来接近它吗?怎么样?

0 个答案:

没有答案