Select 所有具有指定状态的订单保存在另一个 table (PDO)

Select all orders with the specified status saved in another table (PDO)

目前我将一个订单的所有信息集中在一个 table 中,包括订单状态。

以后我会有一个新的table“状态”来创建订单历史。

我的 table 目前看起来像这样(简化):

Table "订单":

id date name
10001 2021-08-24 16:47:52 Surname Lastname
10002 2021-08-30 17:32:05 Nicename Nicelastname

Table "状态":

id order_id statusdate status
1 10001 2021-08-24 16:47:52 new
2 10002 2021-08-30 17:32:05 new
3 10001 2021-08-26 13:44:11 pending
4 10001 2021-09-02 10:01:12 shipped

我的问题是:此时我可以 select 所有状态为“已发货”的订单,这样列出它们:

$sql = $pdo->prepare("SELECT * FROM orders WHERE status = ?");

(? 是我的状态,例如“已发货”)

我知道我必须使用 LEFT JOIN 来组合两个 table(正确吗?或者有 better/easier 方法吗?),但我完全不知道如何 select 所有状态为 X 的订单,因为“状态”table 每个 order_id 可以有多个条目...所以语句必须 select 只有最新的条目!?

如果你没有 1 个具有相同日期的时间戳,你可以使用第一个查询,第二个是为了防止同一个订单有多个时间戳

CREATE TABLE orders
    (`id` int, `date` varchar(19), `name` varchar(21))
;
    
INSERT INTO orders
    (`id`, `date`, `name`)
VALUES
    (10001, '2021-08-24 16:47:52', 'Surname Lastname'),
    (10002, '2021-08-30 17:32:05', 'Nicename Nicelastname')
;


CREATE TABLE status
    (`id` int, `order_id` int, `statusdate` varchar(19), `status` varchar(7))
;
    
INSERT INTO status
    (`id`, `order_id`, `statusdate`, `status`)
VALUES
    (1, 10001, '2021-08-24 16:47:52', 'new'),
    (2, 10002, '2021-08-30 17:32:05', 'new'),
    (3, 10001, '2021-08-26 13:44:11', 'pending'),
    (4, 10001, '2021-09-02 10:01:12', 'shipped')
    ,
    (5, 10001, '2021-09-02 10:01:13', 'shipped')
;
select o.`id` FROM orders o
|    id |
| ----: |
| 10001 |
| 10002 |
select o.`id`,o.`date`, o.`name`,s.`statusdate`
from orders o join status s on o.`id` = s.order_id
where s.`status` = "shipped"
AND s.`statusdate` = (SELECT MAX(`statusdate`) FROM `status` WHERE order_id = o.`id` AND `status` = "shipped")
order by o.`id` desc
   id | date                | name             | statusdate         
----: | :------------------ | :--------------- | :------------------
10001 | 2021-08-24 16:47:52 | Surname Lastname | 2021-09-02 10:01:13
SELECT
id, `date`, `name`,`statusdate`
FROM
(SELECT `date`, `name`,`statusdate`,IF( `id` = @id,@rownum := @rownum +1,@rownum :=1) rn, @id := `id` as id
FROM (select o.`id`,o.`date`, o.`name`,s.`statusdate`
from orders o join status s on o.`id` = s.order_id
where s.`status` = "shipped"
order by o.`id` desc,s.`statusdate` DESC) t2 ,(SELECT @id := 0, @rownum:=0) t1) t2
WHERE rn = 1
   id | date                | name             | statusdate         
----: | :------------------ | :--------------- | :------------------
10001 | 2021-08-24 16:47:52 | Surname Lastname | 2021-09-02 10:01:13

db<>fiddle here