2015-12-29 128 views
0

我有餐厅restaurant_time表。我需要显示餐厅是开放还是关闭。PHP mysql mysql select case with case条件

这是我的查询

$cur_nowtime = strtotime(date("H:i")); 
$curDayOct = strtolower(date("D")); 

SELECT rest.restaurant_id, rest.restaurant_name, 
     restime.".$curDayOct."_status AS res_curr_ocday_status, 
     IF(".$cur_nowtime." BETWEEN ".$curDayOct."_ot AND ".$curDayOct."_ct, 'Open','Closed') AS res_oct_status, 
     CASE WHEN res_curr_ocday_status = 'Open' THEN 'Open' 
     WHEN res_oct_status = 'Open' THEN 'Open' 
     ELSE 'Closed' END AS final_res_status 
FROM restaurantAS rest 
LEFT JOIN restaurant_time AS restime ON rest.restaurant_id = restime.res_id 

我需要在“final_res_status”使用2个alies名“res_curr_ocday_status”和“res_oct_status”

领域的餐厅openclose状态我需要显示输出如下所示。

restaurant_id restaurant_name res_curr_ocday_status res_oct_status final_res_status 
1 aaa  Open Closed Closed 
2 bbbb Open Open Open 
3 cccc Closed Closed Closed 
4 dddd Closed Open Closed 

请参阅我的查询..

SELECT temp.*, (CASE WHEN temp.res_curr_ocday_status = 'Open' AND temp.res_curr_octime_status = 'Open' THEN 'Open' 
ELSE 'Closed' END) AS res_oct_status FROM 
(SELECT rest.restaurant_id, rest.restaurant_name, 
    restime.".$curDayOct."_status AS res_curr_ocday_status, 
    IF(".$cur_nowtime." BETWEEN ".$curDayOct."_ot AND ".$curDayOct."_ct, 'Open','Closed') AS res_curr_octime_status, 
    cty.cityname, zip.zipcode, 
    ROUND(((SUM(rvw.rating)/(COUNT(rvw.rating_id)*5))*100) ,1) AS avg_rating 
    FROM restaurant AS rest 
    LEFT JOIN restaurant_time AS restime ON rest.restaurant_id = restime.res_id 
    WHERE rest.restaurant_status = '1' GROUP BY rest.restaurant_id ORDER BY FIELD(res_oct_status, 'Open') DESC , FIELD(rest.restaurant_zip, '2600') DESC, RAND() LIMIT 0,10) AS temp 

...我得到 “未知列 'res_oct_status' '以条款'”

+0

我宁愿分开查询和表示逻辑。它将降低代码的复杂性并使维护更容易。为此,只需在php中使用'if conditions',而不是在SQL查询中。 –

+0

尝试按字段排序(temp.res_oct_status,'Open')DESC –

+0

同样的错误来临... – mikejohnvino

回答

0

试试这个(第一个是你的查询我修改,第二个是我以前的答案):

SELECT temp.*, (CASE WHEN temp.res_curr_ocday_status = 'Open' AND temp.res_curr_octime_status = 'Open' THEN 'Open' 
ELSE 'Closed' END) AS res_oct_status FROM 
(SELECT rest.restaurant_id, rest.restaurant_name, 
    restime.".$curDayOct."_status AS res_curr_ocday_status, 
    IF(".$cur_nowtime." BETWEEN ".$curDayOct."_ot AND ".$curDayOct."_ct, 'Open','Closed') AS res_curr_octime_status, 
    cty.cityname, zip.zipcode, 
    ROUND(((SUM(rvw.rating)/(COUNT(rvw.rating_id)*5))*100) ,1) AS avg_rating 
    FROM restaurant AS rest 
    LEFT JOIN restaurant_time AS restime ON rest.restaurant_id = restime.res_id 
    WHERE rest.restaurant_status = '1' GROUP BY rest.restaurant_id ) AS temp ORDER BY FIELD(temp.res_oct_status, 'Open') DESC , FIELD(temp.restaurant_zip, '2600') DESC, RAND() LIMIT 0,10 

SELECT temp.*, (CASE WHEN temp.res_curr_ocday_status = 'Open' THEN 'Open' 
      WHEN temp.res_oct_status = 'Open' THEN 'Open' 
      ELSE 'Closed' END) AS final_res_status FROM 
    (SELECT rest.restaurant_id, rest.restaurant_name, 
    restime.".$curDayOct."_status AS res_curr_ocday_status, 
    IF(".$cur_nowtime." BETWEEN ".$curDayOct."_ot AND ".$curDayOct."_ct, 'Open','Closed') AS res_oct_status, 
    FROM restaurantAS rest 
    LEFT JOIN restaurant_time AS restime ON rest.restaurant_id = restime.res_id 
LEFT JOIN city AS cty ON rest.restaurant_city = cty.city_id AND rest.restaurant_status = '1') as temp ORDER BY FIELD(final_res_status , 'Open') DESC 
+0

其工作..谢谢..我需要添加一个表与左连接和需要使用WHERE条件也..LEFT JOIN城市AS cty ON rest.restaurant_city = cty.city_id,其中condition是WHERE rest.restaurant_status ='1 ORDER BY FIELD(final_res_status,'Open')DESC。如何使用? – mikejohnvino

+0

@mikejohnvino请检查我已完成的chagnes –

+0

请添加WHERE条件..... WHERE rest.restaurant_status ='1'ORDER BY FIELD(final_res_status,'Open')DESC – mikejohnvino

-1

使用下面的SQL查询:

SELECT temp.*, (CASE WHEN temp.res_curr_ocday_status = 'Open' AND temp.res_oct_status = 'Open' THEN 'Open' 
     ELSE 'Closed' END) AS final_res_status FROM 
(SELECT rest.restaurant_id, rest.restaurant_name, 
restime.".$curDayOct."_status AS res_curr_ocday_status, 
IF(".$cur_nowtime." BETWEEN ".$curDayOct."_ot AND ".$curDayOct."_ct, 'Open','Closed') AS res_oct_status, 
FROM restaurantAS rest 
LEFT JOIN restaurant_time AS restime ON rest.restaurant_id = restime.res_id) as temp 
+0

你不觉得你已经发布了相同的答案,因为我已经给出了! –

+0

它的工作..谢谢..我需要添加一个表与左连接和需要使用WHERE条件也..LEFT JOIN城市作为cty ON rest.restaurant_city = cty.city_id和条件是WHERE rest.restaurant_status =' 1'按字段排序(final_res_status,'打开')DESC。如何使用? – mikejohnvino