2

我有一个需要解决的复杂问题,现在我有以下表结构(task_schedule):

id   taskid   productid   product_position
1    1        1           1
2    2        1           2
3    3        2           1
4    4        1           3
5    5        2           2
6    6        3           1

product_position的工作方式如下:它应该查看 productid 并从上一个最大值条目开始递增。

我通过以下查询来完成此操作(可能也更容易理解):

INSERT into task_schedule (taskid, productid, product_position)
SELECT 1,1, max(product_position) + 1
FROM task_schedule
WHERE productid=1

(这些值当然归属于 php 后端)

不过,我现在需要一个新专栏。让我们称之为user_position,我将用一个例子重新创建我的表:

id   taskid   productid   product_position   user_position
1    1        1           1                  1
2    2        1           2                  4
3    3        2           1                  2
4    4        1           3                  6
5    5        2           2                  5
6    6        3           1                  3

好的,所以这应该是如何工作的: user_position 应该单独运行每个条目并查看 productid,它应该基于偶数优先级构建一个位置列表。

因此,如果我按 user_position 订购,我会得到以下条目 id 列表:1 3 6 2 5 4

我需要在 php 中完成的一个示例:

想象以下列表:红色 红色 红色 绿色 绿色 绿色 绿色 蓝色 蓝色 黄色

$array1 = array(array("red"), array("red"), array("red"));

$array2 = array(array("green"), array("green"), array("green"), array("green"));

$array3 = array(array("blue"), array("blue"));

$array4 = array(array("yellow"));

$Arrays= array ($array1, $array2, $array3, $array4);

foreach ($Arrays as $type => $list) {
    $ArrayLength[]=count($list);
}


$MergeArray=array();
$flag=true;
for($i=0;$flag==true;$i++)
{
    $flag=false;
    for($j=0;$j < count($ArrayLength);$j++)
    {
        if( $i < $ArrayLength[$j] )
        {
           array_push( $MergeArray , $Arrays[$j][$i] );
           $flag=true;
        }
    }
}

echo "<pre>".Print_r(json_encode($MergeArray), true)."</pre>";

这会返回一个与我想要的模式一致的列表:

[["red"],["green"],["blue"],["yellow"],["red"],["green"],["blue"],["red"],["green"],["green"]]

以上所有只是我需要的一个例子,但通过 MySQL 实现。


不过,我现在什至不知道如何解决这个问题,我需要一种方法来插入新条目并相应地更新 user_position 列。

如果我要使用新的 peoduct_id 在表中添加一个新条目,这应该是最终结果:

id   taskid   productid   product_position   user_position
1    1        1           1                  1
2    2        1           2                  5
3    3        2           1                  2
4    4        1           3                  7
5    5        2           2                  6
6    6        3           1                  3
7    7        4           1                  4

注意 user_position 如何移动以适应新行。

我认为这是一个需要解决的相当复杂的问题(或者我的 mysql 可能就是那么弱),我认为这个问题没有一个简单的解决方案,所以你可能有任何关于如何通过 mysql 解决这个问题的输入(mysql做繁重的工作会很棒),但我也欢迎 PHP 解决方案以及多个查询等等。不幸的是,我无法删除此列,很容易获取条目并让 PHP 对我的信息进行排序,但我确实需要在数据库中实现这一点。

来自社区的任何意见都会非常棒。

4

1 回答 1

1

使用您正在使用的普通插入查询插入

  INSERT into task_schedule (taskid, productid, product_position, user_position)
  SELECT 1,1, max(product_position) + 1, 0 FROM task_schedule WHERE productid=1;

然后使用以下内容根据 product_position 更新所有条目

  SET @counter = 0;

  UPDATE task_schedule SET user_position = @counter := @counter + 1 ORDER BY product_position asc, productid asc;

这是SQL小提琴链接

于 2013-09-03T06:19:50.083 回答