2013-03-13 20 views
0

請幫助我如何解決這個......我這個新手...如何設置下一個空值與第一個值使用選擇或查看功能在PHP MySQL?

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

其中date_played,DATE_END和持續時間字段是DATETIME

 
idt date_played   date_end    duration 
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  NULL     NULL     00:01:37 
. 
. 
. 
n  NULL     NULL     00:02:32 

的問題是..

  1. 我們怎樣才能設置下一個date_played空值像IDT = 2和其他IDT,所以在開始用IDT = 1 DATE_END值,通過計算整個表只使用SELECT並使其在VI EW ...?
  2. 我們如何在idt = 2和另一個idt中設置下一個date_end null值,其中date_played已經像問題1中那樣設置好了,只需使用SELECT並將其設置爲VIEW?

請幫助...謝謝

的樣品如下表所示的結果......如果這是不可能的......如何與更新得到它?

 
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 
. 
. 
. 
TILL THE END 

謝謝你......

回答

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 objectDateInterval object文檔。 作爲獎勵,上面的代碼可以支持時區。

然後,您可以將這些值保存回數據庫;我不會使用單一查詢解決方案,因爲它可能需要更多時間並顯着減慢數據庫的速度。

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 

請參閱小提琴here。如果您確定沒有空白,並且每行都排除了第一個空值,則可以簡化該查詢。

+0

謝謝@fthiella,我看到了小提琴......它的工作原理......它像一個魅力...... :) 但當我在本地主機上的mysql嘗試...我發現麻煩... – iRIANDI 2013-03-14 00:11:38

+0

我試了它..它的作用就像一個魅力......但是當我在本地主機上嘗試它時... date_played字段顯示[BLOB-19B] 這裏是顯示快照的鏈接.. http:// www.mediafire.com/view/?vf4f9re3mf3ct# – iRIANDI 2013-03-14 00:19:12

相關問題