【问题标题】:Query for choose all orders from all restaurants for the current day查询选择当天所有餐厅的所有订单
【发布时间】:2013-09-04 18:02:56
【问题描述】:

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

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

所以我有三张桌子:

  1. restaurants 带有一些字段 [id, ]​​i>
  2. orders 有一些字段 [id, resid, orderdate,]
  3. hours 带有一些字段 [id, resid, day, open, close] day 是一个从 0 到 6 的数字,打开和关闭是 00:00:0023:59:59 之间的时间

谢谢

这正是我需要的

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

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

【问题讨论】:

  • Inner Join WHERE open interval close =1day
  • 残留?那有多懒惰?除此之外,您必须决定架构中的“一天”是什么。否则,您将不可避免地计算相同的订单两次。
  • 米海这是什么??????你能写一个答案吗?
  • 我认为这是一个很好的问题,但缺乏清楚理解的信息。 @Teodoros 请更新您的问题,添加示例、研究案例、一些数据等。易于理解。您也可以将问题标题更新为一般性的内容,这将有所帮助。
  • 问题已被编辑,但没有真正改善。听从@Hardy 的建议!

标签: mysql


【解决方案1】:

这是你想要的吗?

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

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

【讨论】:

  • 感谢您的回答。这不是我想要的,因为如果一家餐厅在 24:00 之后关闭,假设 2:00 现在是 1:00,这个查询不包括 24:00 之前的订单。当我说当天是指餐厅的当前工作日。
【解决方案2】:

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

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

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

如果 hours.close

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 表上的过滤器以获得所需的正确数据。

希望有帮助

【讨论】:

  • 您好,谢谢您的回答。我认为您尝试在子查询中查找开放餐厅,但我想要所有餐厅的所有订单,即使它们已关闭,但除此之外,我已经尝试过此查询,并且始终返回所有餐厅的订单,即使它们是开放或关闭的。你的假设是正确的
  • 对不起,我当然想要当天开放餐厅的订单
【解决方案3】:

解决办法是

   " 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) )" .
        ")";

【讨论】:

  • WEEKDAY() 可能是更好的方法,c.close &lt; c.open=TRUE 是什么意思,可以比较日期和字符串b.orderdate&gt;= CONCAT(subdate(current_date, 1),' ',c.open) )
  • 如果您运行此查询以获取报告,请注意您的查询包括将要关闭的餐厅,这意味着餐厅数据一天内未完成。您的报告可能不正确。
  • 哈代,谢谢你的笔记。你觉得这个stackoverflow.com/questions/1318630/…不对吗?
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多