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 が弱いだけかもしれません)。これに対する簡単な解決策はないと思います。大変な作業を行うのは素晴らしいことですが)、複数のクエリなどを使用した PHP ソリューションも歓迎します。残念ながら、この列を削除することはできません。エントリを取得して、PHP に情報を並べ替えるのは簡単ですが、これをデータベースに実装する必要があります。

コミュニティからの意見は本当に素晴らしいものです。

4

1 に答える 1