Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写查询以根据条件检查另一个表?_Php_Mysql_Sql - Fatal编程技术网

Php 如何编写查询以根据条件检查另一个表?

Php 如何编写查询以根据条件检查另一个表?,php,mysql,sql,Php,Mysql,Sql,我有一个订单状态表,如下所示: order_id order_status 1 100 2 1000 3 1000 我有另一个表order\u status\u history,它存储订单的历史数据: id order_id order_status status_date 1 1 100 2016-01-01 2 2 100 2016-02-0

我有一个订单状态表,如下所示:

order_id   order_status
1          100
2          1000
3          1000
我有另一个表order\u status\u history,它存储订单的历史数据:

id  order_id   order_status  status_date
1   1          100           2016-01-01
2   2          100           2016-02-01
3   2          300           2016-04-01
4   3          100           2016-04-01
5   3          400           2016-04-01
6   3          1000          2016-04-01
7   2          1000          2016-05-01
我正在尝试建立一个每日报告,其中对于给定的日期,我想看看订单是否已完成或正在进行中。我对SQL非常不熟悉,不知道怎么做。如果某个日期的订单状态小于1000,则该订单正在进行中,否则该订单已完成

例如:2016年4月1日,报告内容如下:

order_id    status
1           in-progress (because as of report date, its latest status is 100)
2           in-progress (because as of report date, its latest status is 300)
3           completed   (because as of report date, its latest status is 1000)
我正在尝试以下方法,以尝试至少查找正在进行的订单:

select distinct s.order_id, s.order_status
from order_status 
    left join order_status_history h on h.order_id = s.order_id
where max(h.status_date) <'2016-04-01'
  and status < 1000

非常感谢您的帮助

我不知道你的状态是什么意思。但对于给定的订单,它们似乎总是在增加。因此,最近的一个将具有最大的价值:

select osh.order_id, max(osh.order_status)
from order_status_history osh
group by osh.order_id;
如果增加状态的假设不成立,则可以使用聚合和联接:

select osh.*
from order_status_history osh join
     (select order_id, max(status_date) as maxsd
      from order_status_history
      group by order_id
     ) o
     on osh.order_id = osh.order_id;
至于文本描述,您实际上应该将这些信息存储在一个引用表中,并将其加入其中。我怀疑这就是order_状态,但只是描述得不好。否则,您将使用case语句:

select (case when osh.order_status = 100 then 'in-progress'
             when osh.order_status = 100 then 'in-progress'
             when osh.order_status = 1000 then 'completed'
        end)

如果要获取指定日期的订单id状态,可以使用下一个查询

SELECT OS.order_id,
        CASE WHEN 
            (SELECT MAX(OSH.order_status) 
             FROM order_status_history AS OSH
             WHERE OSH.order_id = OS.order_id
                       AND OSH.status_date <= @date)) < 1000
             THEN 'in-progress'
             ELSE 'completed' END status
FROM order_status AS OS
试试这个

    select m.order_id,IF(order_done < order_status,'in-progress (because as of report date, its latest status is '||m.order_done,'completed (because as of report date, its latest status is '||m.order_done) status
    from order_status m left join (select osh.order_id, max(osh.order_status) order_done
    from order_status_history osh
where osh.status_date <'2016-04-01' and osh.status < 1000
    group by osh.order_id) n on m.order_id = n.order_id

假设基于订单1的数据,即使当前订单状态也记录在历史记录表中:

select distinct s.order_id, s.order_status as current_order_status, if(h2.order_status<1000,'in progress','completed') as status_at_report_date
from order_status left join
    (select order_id, max(id) as max_id from order_status_history h1
    where h1.status_date<='2016-04-01') t on t.order_id=s.order_id
    left join order_status_history h2 on t.max_id=h2.id

订单状态表中的当前状态是否也在历史记录表中?订单状态表没有意义。谢谢!您还可以帮我找出如何为订单的maxstatus\u date选择相应的状态吗?@UndefinedVariable。我相信这就是这些疑问的作用。