簡體   English   中英

mysql:在子查詢中引用主查詢

[英]mysql: reference main query in subquery

我有2個表:Orders和order_line

在訂單中,我有類似的數據:

id | name   | order_date
1  | order 1| 2014-01-01
2  | order 2| 2015-01-01
3  | order 3| 2016-01-01

在訂單行中,有如下數據:

id | Order_id | order_status |status_date
1  | 1        | New          | 2014-01-01
2  | 1        | Shipped      | 2014-10-01
3  | 2        | New          | 2015-01-01
4  | 2        | Canceled     | 2015-03-01
5  | 3        | New          | 2016-01-01
6  | 3        | Canceled     | 2016-02-01

訂單行確實有日期和狀態

現在,我想知道在給定的月份/年份中有多少行具有給定的狀態。 因此,舉例來說,我希望狀態為“新”的2014-08的值為1,值為“已取消”的2016-03的值為2。 要進行報告,我需要以某種方式獲取每個訂單的最新order_line行,並對此進行報告。 如果我只有一個訂單,則可以這樣獲得最新的訂單行:

select orderline.* from orders o 
join (select * from orderline
      where order_id =  1
      and status_date = (select max(status_date) 
                        from orderline 
                        where order_id = 1
                        and status_date < MAKEDATE(2018, 8))) as orderline on orderline.order_id = o.id 
where o.id = 1;

我會以某種方式需要將子查詢鏈接到我猜的父查詢,但是我不知道該怎么做。 當我嘗試用“ where order_id = o.id”替換子查詢中的1時,我得到錯誤代碼:1054。“ where子句”中的未知列“ o.id”

創建/填充示例表的代碼:

  CREATE TABLE orders
    (`id` int(11), `name` varchar(7), `order_date` datetime)
;

INSERT INTO orders
    (`id`, `name`, `order_date`)
VALUES
    (1, 'order 1', '2014-01-01 00:00:00'),
    (2, 'order 2', '2015-01-01 00:00:00'),
    (3, 'order 3', '2016-01-01 00:00:00')
;



CREATE TABLE orderline
    (`id` int, `Order_id` int, `order_status` varchar(8), `status_date` datetime)
;

INSERT INTO orderline
    (`id`, `Order_id`, `order_status`, `status_date`)
VALUES
    (1, 1, 'New', '2014-01-01 00:00:00'),
    (2, 1, 'Shipped', '2014-10-01 00:00:00'),
    (3, 2, 'New', '2015-01-01 00:00:00'),
    (4, 2, 'Canceled', '2015-03-01 00:00:00'),
    (5, 3, 'New', '2016-01-01 00:00:00'),
    (6, 3, 'Canceled', '2016-02-01 00:00:00')
;

我想你想要這樣的東西:

select ol.order_status, count(*)
from orderline ol
where ol.status_date = (select max(ol2.status_date)
                        from orderline ol
                        where ol2.order_id = ol.order_id and
                              ol2.status_date < '2014-08-01'
                       )
group by ol.order_status;

這將返回截至特定日期(子查詢中的日期)具有給定狀態的訂單行數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM