2015-12-05 73 views
1

我已經開餐廳餐桌&星期幾(星期一到星期日)的關閉時間。我需要使用開放時間&找到餐廳狀態。而且我還需要列出第一家開放餐廳,然後關閉餐廳。使用mysql查找打開和關閉狀態

restaurant table 
---------------- 
resid resname 
1 Res1 
2 Res2 
3 Res3 
4 Res4 
5 Res5 
6 Res6 
7 Res7 



restaurant_time 
---------------- 
resid mon_otime mon_ctime tue_otime tue_ctime wed_otime wed_ctime thu_opentime 
1 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
2 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
3 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
4 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
5 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
6 06:00 23.30 06:00 23.30 06:00 23.30 10:00 
7 10:00 23.30 06:00 23.30 06:00 23.30 10:00 

我想列出輸出像下面...

resid resname Restaurant_status 
1 Res1 open 
3 Res3 open 
4 Res4 open 
7 Res7 open 
2 Res2 closed 
5 Res5 closed 
6 Res6 closed 

請幫助我,在此先感謝。

+0

1.您首先打開並關閉restsurant是什麼意思? 2.到目前爲止您嘗試過什麼?你應該規範這張桌子。 – Shadow

+0

看到正常化 – Strawberry

+0

對不起,我沒有任何想法。所以請解釋一下,我怎麼寫一個mysql查詢。 – mikejohnvino

回答

0

首先,如果我解決這個問題,我會正常化restaurant_time

CREATE TABLE restaurant_time 
(
    resid  INT, 
    dayofweek INT, 
    opentime  TIME, 
    closetime TIME, 
    PRIMARY KEY (resid, dayofweek), 
    FOREIGN KEY (resid) REFERENCES restaurant (resid) 
) ENGINE = InnoDB 

然後我會創建一個函數來確定給定的餐廳是在特定的時間開放:

CREATE FUNCTION is_open(rest_id INT, theday INT, thetime TIME) 
    RETURNS BOOLEAN 
    BEGIN 
    DECLARE otime TIME; 
    DECLARE ctime TIME; 
    SELECT opentime, closetime 
     INTO otime, ctime 
     FROM restaurant_times t 
     WHERE t.resid = rest_id 
     AND t.dayofweek = theday; 
    IF (TIMEDIFF(opentime, thetime) < 0) 
     AND (TIMEDIFF(thetime, closetime) < 0) THEN 
     RETURN TRUE; 
    ELSE 
     RETURN FALSE; 
    END; 

最後,查詢

SELECT r.resid, r.name, 
    IF(is_open(r.resid, DAYOFWEEK(NOW()), TIME(NOW())), "open", "closed") 
    FROM restaurant r; 

應該給你想要的結果。

注意前面的代碼沒有以任何方式進行測試,也不能保證沒有語法錯誤。