如何跨两行执行where子句?

fhg3lkii  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(311)

存储表

store_id, open_247
996, 0

存储周期表

store_id, day, opentime, closetime
996, 3, 00:00:00, 04:00:00
996, 3, 08:00:00, 23:59:59
996, 4, 00:00:00, 04:00:00
996, 4, 08:00:00, 23:59:59

在php中,我确定当前时间、当前日期、30分钟后的时间和30分钟后的日期:

currenttime: 23:42:01
currentday: 3
timeplus30: 00:12:01
dayattimeplus30: 4

我想确定一家商店现在是否开门,30分钟后是否开门。
对于上面的示例数据,由于store\u period的第2行和第3行,store\u id 996应该被认为是打开的。
我要为任何具有open\u 247=1,或具有符合currenttime和currentday的行以及符合timeplus30和dayattimeplus30的行的存储检索存储标识。
这是我的尝试:

SELECT store_i.store_id
FROM store_i 
WHERE store_i.open_247 = 1 
UNION 
SELECT store_i.store_id
FROM store_i 
JOIN store_period 
ON store_i.store_id = store_period.store_id 
WHERE ((CAST('23:42:01' AS TIME) >= opentime 
AND CAST('23:42:01' AS TIME) <= closetime 
AND store_period.day = 3) 
AND (CAST('00:12:01' AS TIME) >= opentime 
AND CAST('00:12:01' AS TIME) <= closetime 
AND store_period.day = 4))

对于上面的示例,它不返回任何结果,这是意外的。
我认为这是因为在第二个union子句的where子句中没有一行同时满足这两个条件。
必须满足两个条件(立即打开,30分钟后打开)。在本例中,它们跨两行满足,但同一行可以满足两次。我如何检查这种情况?
我曾想过和另一个工会合作,但即使只满足了一个条件(例如,它现在是开放的,但在30分钟内没有开放),它也会返回一行。
我想我需要在两行之间做一个where子句,或者找其他方法来做。

kxeu7u2r

kxeu7u2r1#

我会尝试以下方法:

SELECT store_i.store_id
FROM store_i 
WHERE store_i.open_247 = 1 
    or (store_i.store_id in (
        SELECT store_i.store_id
        from store_period 
        where CAST('23:42:01' AS TIME) >= opentime 
        AND CAST('23:42:01' AS TIME) <= closetime 
        AND store_period.day = 3)
    and 
        (SELECT store_i.store_id
        from store_period 
        where CAST('00:12:01' AS TIME) >= opentime 
        AND CAST('00:12:01' AS TIME) <= closetime 
        AND store_period.day = 4)
    )

相关问题