0

请帮我解决这个问题...我是新手...

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

其中 date_played、date_end 和 duration 字段是 DATETIME

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

问题是..

  1. 我们如何设置下一个 date_played 空值,如 idt=2 和另一个 idt,从 idt=1 中的 date_end 值开始,然后仅使用 SELECT 并在 VIEW 上进行计数,以此类推?
  2. 我们如何像在 idt=2 和另一个 idt 中一样设置下一个 date_end 空值,而 date_played 已经像问题 1 中那样设置,只需使用 SELECT 并在 VIEW 上进行设置?

请帮助...谢谢

结果示例如下表...如果不可能...如何通过更新获得它?

idt date_played date_end 持续时间
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

在此处查看小提琴。如果您确定没有间隙,并且除第一行之外的每一行都有空值,则可以进一步简化此查询。

于 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 对象的更多文档。作为奖励,上面的代码可以支持时区。

然后,您可以将这些值保存回数据库;我不会使用单查询解决方案,因为它可能需要更多时间并显着减慢您的数据库。

于 2013-03-13T16:28:14.457 回答