-1

如何编写一个 mysql 查询来选择当天所有餐厅的所有订单?

部分餐厅可能会在 24:00 后关闭。

所以我有三张桌子:

  1. restaurants有一些字段 [ id, ]
  2. orders有一些字段 [ id, resid, orderdate,]
  3. hours某些字段 [ id, resid, day, open, close]day是 0-6 之间的数字,开盘和收盘是和之间的00:00:00时间23:59:59

谢谢

这就是我需要的

SELECT b.*
FROM restaurants a, orders b, hours c
WHERE a.id=b.resid
AND a.id=c.resid

---- 这里我需要选择餐厅当前工作日订单的代码,但如果餐厅在 24:00 后关闭,当前工作日可能包括前一个日历日的一些订单

4

3 回答 3

0

这是你想要的吗?

select o.*
from orders o
where o.orderdate = curdate();

如果没有,您能否修改您的问题以更好地解释您想要什么?

于 2013-09-01T15:10:55.810 回答
0

解决方案是

   " SELECT b.*".
   " FROM orders b, rests a, times c ".
   " WHERE a.id=b.resid ".
   " AND a.id=c.resid ".
   " AND (".
        "( c.day=dayofweek(subdate(current_date, 1))-1 " .
        " AND c.close < c.open " .
        " AND c.close> TIME(NOW())" .
        " AND b.orderdate>= CONCAT(subdate(current_date, 1),' ',c.open) )" .
        " OR " .
        "( c.day=dayofweek(current_date)-1 " .
        " AND c.close >= c.open " .
        " AND c.close> TIME(NOW())" .
        " AND b.orderdate>= CONCAT(current_date,' ',c.open) )" .
        " OR " .
        "( c.day=dayofweek(current_date)-1 " .
        " AND c.close < c.open " .
        " AND CONCAT(ADDDATE(CURRENT_DATE, 1),' ',c.close)> TIME(NOW())" . 
        " AND b.orderdate>= CONCAT(current_date,' ',c.open) )" .
        ")";
于 2013-09-02T11:03:52.990 回答
0

因为你没有提供太多信息,所以我在这里做 2 个假设

假设 1:您在凌晨 1 点运行此查询,并希望从昨天到现在的凌晨 1 点获得所有订单假设 2:没有餐厅 24 小时营业

hours.day =  WEEKDAY(SUBDATE(CURDATE(), 1)

如果 hours.close < hours.open 表示餐厅从 YESTERDAY + open_time 到 TODAY + close_time 开放,否则在 YESTERDAY 开放和关闭

STR_TO_DATE(CONCAT(DATE_FORMAT(SUBDATE(CURDATE(), CASE WHEN c.close < c.open THEN  1 ELSE 0 END), '%Y%m%d'), c.close), '%Y%m%d%T')

所以你的查询类似于

SELECT b.*
FROM restaurants a, orders b
WHERE a.id=b.resid
AND a.id in (
    select c.resid
    from hours c
    where c.day =  WEEKDAY(SUBDATE(CURDATE(), 1)
    and STR_TO_DATE(CONCAT(DATE_FORMAT(SUBDATE(CURDATE(), 1), '%Y%m%d'), c.open), '%Y%m%d%T') > SUBDATE(CURDATE(), 1)
    and STR_TO_DATE(CONCAT(DATE_FORMAT(SUBDATE(CURDATE(), CASE WHEN c.close < c.open THEN  1 ELSE 0 END), '%Y%m%d'), c.close), '%Y%m%d%T') <= CURDATE()
    )

我不确定orders.orderdate,因此您应该更新orders表格上的过滤器以获取所需的正确数据。

希望这有帮助

于 2013-09-01T20:40:29.643 回答