2016-11-20 31 views
1

我试图执行SQL SELECT查询以获取城市内的所有商店,并且还有一个字段以通知商店是否在工作时间内。SQL SELECT根据工作时间获取公司状态

这是SQL我到目前为止:

$day = date('w'); 
$hour = date('H:i:s'); 

SELECT a.id, a.rating, a.name, a.image, b.cityName 
    (
     SELECT 1 FROM tbStore a, workingHour b 
     WHERE a.id = b.id_store 
     AND b.weekDay = '$day' 
     AND b.hourOpen <= '$hour' 
     AND b.hourClose >= '$hour') 
    ) as 'open' 

FROM tbStore a, tbCity b 
WHERE b.url = '$url' 
AND a.id_city = b.id 
ORDER BY open 

我正在检查该值的方式是一个布尔值,所以“打开”字段必须是0(关闭)或1(开)。

这是一种工作......但问题是,如果只有一家商店在工作时间内,所有其他商店也将“开放”,而不仅仅是特定的商店。

我还看到了一些人们使用CASE而不是另一个select的sql语句,因此只要最终结果是正确的,就可以使用任何其他类型的代码。

回答

1

您正在重新定义tbStore a并失去了限制$url。你可能只需要改变:

SELECT 1 FROM tbStore a, workingHour b 

要:

SELECT 1 FROM workingHour b 
+0

我也不得不重命名表的信。因为城市表是'b',我没有'workingHourb',而是'workingHourc'。但现在它正在工作!谢谢 – celsomtrindade

1

我刚才重写你的查询使用显式连接方式

SELECT 
     a.id 
    , a.rating 
    , a.name 
    , a.image 
    , b.cityName 
    , when(c.id_store is not null then 1 else 0 end) as open 
FROM tbStore a 
inner join tbCity b on a.id_city = b.id 
LEFT join workingHour c on a.id = c.id_store 
WHERE b.url = '$url' 
AND c.weekDay = '$day' 
AND c.hourOpen <= '$hour' 
AND c.hourClose >= '$hour' 
ORDER BY open 
+0

这种工作方式..结果只包含商店,当他们是'开放',如果他们关闭,他们没有出现在结果上。我需要的是获得所有的商店,但根据工作时间将字段设置为“0”或“1”。 – celsomtrindade

+0

@CelsomTrindade。 .. id_store案件有一个错误的别名..我有udapte的答案.. – scaisEdge