0

これを解決する方法を教えてください...私はこれの初心者です...

SELECT idt, date_played, date_end, duration FROM `v_currentshow`

date_played、date_end、duration フィールドは DATETIME です。

idt date_played date_end duration
1 2013-03-13 22:33:48 2013-03-13 21:58:20 00:35:28
2 ヌル ヌル 00:02:11
3 ヌル ヌル 00:00:32
4 ヌル ヌル 00:36:42
5 ヌル ヌル 00:01:30
6 ヌル ヌル 00:25:12
7 ヌル ヌル 00:01:37
.
.
.
n NULL NULL 00:02:32

質問は..

  1. idt=2 と別の idt のように次の date_played null 値を設定するにはどうすればよいですか?
  2. 次の date_end null 値を idt=2 と別の idt のように設定するにはどうすればよいでしょうか?

助けてください...ありがとう

次の表のような結果のサンプル...それができない場合...更新で取得するにはどうすればよいですか?

idt date_played date_end duration
1 2013-03-13 22:33:48 2013-03-13 21:58:20 00:35:28
2 2013-03-13 21:58:20 2013-03-13 22:00:31 00:02:11
3 2013-03-13 22:00:31 2013-03-13 22:01:03 00:00:32
4 2013-03-13 22:01:03 2013-03-13 22:37:45 00:36:42
5 2013-03-13 22:37:45 2013-03-13 22:39:15 00:01:30
6 2013-03-13 22:39:15 2013-03-13 23:04:37 00:25:12
7 2013-03-13 23:04:37 2013-03-13 23:06:14 00:01:37
.
.
.
最後まで

ありがとうございました...

4

2 に答える 2

1

MySql変数を利用する、次のようなソリューションを使用します。

SELECT
  idt,
  date_played,
  date_end,
  duration
FROM (
  SELECT
    v_currentshow.idt,
    CASE WHEN date_played IS NULL THEN @start ELSE date_played END date_played,
    CASE WHEN date_end IS NULL THEN
           CASE WHEN date_played IS NULL THEN @start ELSE date_played END
           + INTERVAL TIME_TO_SEC(duration) SECOND
         ELSE date_end
    END date_end,
    @start :=
      CASE WHEN date_end IS NULL THEN
             CASE WHEN date_played IS NULL THEN @start ELSE date_played END
             + INTERVAL TIME_TO_SEC(duration) SECOND
           ELSE date_end
      END,
    duration
  FROM
   v_currentshow,
   (SELECT @start := null) r
) s

ここでフィドルを参照してください。ギャップがなく、最初の行を除くすべての行に null 値があることが確実な場合は、このクエリをさらに単純化できます。

于 2013-03-13T16:35:13.277 に答える
0

PHP で処理を行う必要があります。クエリがおかしいと思われる場合は、PHP で後処理する方がよいでしょう。

あなたの問題にタグを付けたので、私の解決策は有効なようですPHP

クエリが配列を返すことを認めれば、次のようにすることができます。

$results = array(); // the array of results returned by the query
$previousEndDate = null; // default it to null to avoid weird situations

foreach ($results as &$row) { // you can replace the pointer (&) with a new array that gets the proper values injected into it ~ but it's more readable because it highlights the most important lines

    if ($row['date_played'] === null && $previousEndDate !== null) {
        $row['date_played'] = $previousEndDate;
    }

    if ($row['date_end'] === null) {
        $dateInterval = new DateInterval('P0000-00-00T'. $row['duration']); // we create a valid PHP interval to add on top of the date_played
        $datePlayed = new DateTime($row['date_played']); // create a valid DateTime object off the SQL value
        $row['date_end'] = $datePlayed->add($dateInterval); // and we add the interval to the datePlayed
    }

    $previousEndDate = $row['date_end'];
}

DateTime オブジェクトDateInterval オブジェクトに関するその他のドキュメント。おまけとして、上記のコードはタイムゾーンをサポートできます。

その後、これらの値を DB に保存できます。時間がかかり、DB が大幅に遅くなる可能性があるため、1 回のクエリで実行するソリューションは使用しません。

于 2013-03-13T16:28:14.457 に答える