MySQLの1つのクエリでは不可能だと確信しています。
右側の図では、注文は 2 つの別々のステップで行われています。
IDで並べ替え
レベル >= 2 の場合、各ブロックを p_id で並べ替えます
ブロックを識別し、それらを繰り返し処理して、各ブロックを個別にソートする必要があるため、MySQL でこれを行うのは非常に困難です。
ブロック内での順序付けが必要な場合に同様のことを行い、それらの順序付けられたブロックから選択しました。ここでそれを見ることができますが、私が言ったように、その SQL コードは 5 つの一時テーブルを含む恐ろしく複雑だと思います。おそらく必要な一時テーブルは少なくなりますが、それでも非常に複雑な手順であり、非常に遅く、保守が困難です。
「実際のデータは何百もあり、本当に並べ替える必要があります。」
コードで必要に応じて並べ替えることができない理由はありますか?
$blockStart = FALSE;
$count = 0;
foreach($dataArray as $data){
if($blockStart === FALSE){
$blockStart = $count;
}
if($data['level'] < 2){ //Block has finished
sortBlock($dataArray, $blockStart, $count);
$blockStart = $count;
}
$count++;
}
sortBlock($dataArray, $blockStart, $count - 1);
function sortBlock($dataArray, $indexStart, $indexEnd){
//Sort the elements of $dataArray, between $indexStart and $indexEnd inclusive
//by the value of p_id
}
一般的なプログラミングの問題を MySQL で解決しようとすると、Java ではプログラマーの 10 分の 1 の時間で解決できる場合 (そしておそらく実行速度も向上する可能性があります) は、従うべき良い道ではありません。