2012-04-17 43 views
0

我正在嘗試寫ONE SQL查詢,它總是給出三行結果行。數據庫如下:MySQL查詢從播放列表計劃中選擇播出節目

uid | program_date | program_time | program_name 
------------------------------------------------ 
1 | 2012-04-16 | 21:00  | Some movie 
2 | 2012-04-16 | 23:00  | Program end 
3 | 2012-04-17 | 10:00  | Animation 
4 | 2012-04-17 | 11:00  | Some other movie 
5 | 2012-04-17 | 12:00  | Some show 

我需要的所有 - 總是有三排 - 什麼是現在,下一個和upcomming。所以如果今天是2012-04-16 21:00它應該輸出Some movieProgram end,Animation。它應該輸出Program end,Animation,Some other movie

問題是,我需要「導航」回在一天,如果沒有記錄WHERE program_date = date("Y-m-d") AND program_time <= date("H:i:s");

還有一個問題 - 數據庫不具有Unix的時間戳字段,只Uidprogram_date(日期字段)和program_time (時間字段)和program_name

此外,有可能是Uid沒有按順序插入表中,因爲有些節目條目可能會插入到現有的節目時間表中。

我想各種辦法,但是想做一個SQL查詢這一切,而不在PHP循環。

誰能幫助我在這裏?

回答

2

隨着電視人民數顯時間比較奇怪的方式,MySQL的函數可以被創建以處理其非人類;-)邏輯更簡單:

CREATE FUNCTION TV_DATE(d CHAR(10), t CHAR(5)) 
RETURNS CHAR(16) DETERMINISTIC 
RETURN CONCAT(d, IF (t < "06:00", "N", " "), t); 

用戶定義的函數每個數據庫聲明這可能只做一次。 DETERMINISTIC表明函數對於相同的輸入總是返回相同的結果,而內部MySQL優化器可能依賴於該輸入。 N只是一個比空格大的字符串(比較字符串)。把它當作助記符下一個晚上

:時間應該總是格式化2位!

然後使用這個功能,我們可以選擇我們需要的更簡單:

-- what is on air now 
(SELECT `program_name`, TV_DATE(`program_date`, `program_time`) AS `tv_time` 
FROM `table` 
WHERE (`tv_time` <= TV_DATE(date("Y-m-d"), date("H:i")) 
ORDER BY `tv_time` DESC 
LIMIT 1) 

    UNION 

-- next and upcomming 
(SELECT `program_name`, TV_DATE(`program_date`, `program_time`) AS `tv_time` 
FROM `table` 
WHERE (`tv_time` > TV_DATE(date("Y-m-d"), date("H:i")) 
ORDER BY `tv_time` ASC 
LIMIT 0, 2) 

請記住,如果在數據庫中的所有記錄都在將來你會得到其中只有2。 同樣的情況下,當下一個程序是數據庫中的最後一個。

您可能爲了區分這些2種情形添加不同的恆定值到查詢。

+0

感謝您的回答,但它無法按預期工作。 union select的第一部分沒有從我的第一篇文章的數據庫示例中獲取正確的記錄,日期爲2012-04-17,時間爲00:00。 該查詢工作,如果時間是從10:00 :( – 2012-04-18 11:17:25

+0

愚蠢的我:幾場排序條件應該寫不同的方式。現在它正在工作(我測試過) – kirilloid 2012-04-18 11:44:24

+0

它似乎在工作! :)非常感謝,你做得很棒! – 2012-04-18 12:49:28

相關問題