我有一个需要修复的复杂问题,现在我有以下表结构(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对我的信息进行排序,但我真的需要在数据库中实现这一点。
来自社区的任何意见都会很棒。
答案 0 :(得分: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;