0

DB (MySQl) からいくつかの情報を取得/表示する方法について助けが必要です

私の現在のテーブルは次のようになります。

id | title | level | start_afterID | days | 

1  |   A   |   0   |       0       |   7  |
2  |   B   |   1   |       1       |   5  |
3  |   C   |   1   |       2       |   3  |
4  |   D   |   1   |       3       |   2  |
5  |   E   |   1   |       4       |   2  |
6  |   F   |   1   |       3       |   6  |

レベル「0」は、このジョブが最初に開始され、開始日時が別のテーブルにあることを意味します ( $config_start)

レベル = 1 の他のすべてのエントリは、開始が固定されておらずid、ジョブ ( start_afterID) の後に開始されます。

また、すべてのジョブは DAYS フィールドからの日数で持続します。

このテーブルでは、ID 6 (タイトル F) のジョブは jobID 3 の後に開始する必要があります。開始時間は次のようになります。

$config_start + jobID 3 + jobID 2;

このジョブの $end は:

$config_start + jobID 3 + jobID 2 + 6;

最後に、DB からのすべてのジョブを着信順に表示する必要があります。

私はこれで最善を尽くしましたが、すべての親レベルを確認して計算する方法がわかりません。また、このために新しい管理を作成できます。新しいジョブを挿入するためのより良い方法があるのではないでしょうか?

これについて助けてくれてありがとう、

4

2 に答える 2

0

まず第一に、level列を再考することをお勧めします - IIUC これはブーレアにすぎず、これがジョブルートかどうかを示しています - この情報は start_afterID が 0 であることにも示されています。

開始時刻と終了時刻の計算は重要な作業であり、大量の DB 平均を必要とします。そのため、2 つ目のテーブルを作成し、id|startday|enddayこの (基本的にはキャッシュ) テーブルが更新されるように計算ロジックを移動することをお勧めします。ジョブの変更により、通常の操作のための高速なクエリ パスが得られます。

このタイミング テーブルの内容を計算するには、次のようにします。

function docalc($after,$startday) {

    $sql="SELECT * FROM tablename WHERE start_afterID=$after";

    //Run the query, this depends on your framework used

    //Pseudocode from here - again depends on your framework
    foreach ($row) {
        $id=$row['id'];
        $endday=$startday+$row['days']; //This will not be a simple addition, depending on your data types

        //Adapt the following to your data types
        $sql="REPLACE INTO timingcache SET id=$id, startday=$startday, endday=$endday";
        //Run the query - depends on your framework

        docalc($id,$endday);

    } //for each row

}


//this assumes $config_start is set correctly
docalc(0,$config_start);
于 2012-06-05T17:09:41.300 に答える
0

levelデータを、 、start_afterIDで並べ替えたいとお考えdaysでしたら、

その場合、選択を行う必要があります。select * from table order by level asc, start_afterID asc, days desc;

于 2012-06-05T17:21:37.090 に答える