首页 > 解决方案 > 选择保存在另一个表中的具有指定状态的所有订单(PDO)

问题描述

目前,我在一张表中拥有订单的所有信息,包括订单状态。

将来我将有一个新表“状态”来制作订单历史记录。

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

表“订单”:

ID 日期 姓名
10001 2021-08-24 16:47:52 姓 姓
10002 2021-08-30 17:32:05 Nicename Nice姓氏

表“状态”:

ID order_id 状态日期 地位
1 10001 2021-08-24 16:47:52 新的
2 10002 2021-08-30 17:32:05 新的
3 10001 2021-08-26 13:44:11 待办的
4 10001 2021-09-02 10:01:12 已发货

我的问题是:此时我可以选择所有状态为“已发货”的订单来列出它们:

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

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

我知道我必须使用 LEFT JOIN 来组合这两个表(正确?还是有更好/更简单的方法?),但我完全不知道如何选择状态为 X 的所有订单,因为“状态”表可以每个 order_id 有多个条目...所以该语句必须只选择最新的条目!?

标签: mysqlselectpdoleft-joinwhere-clause

解决方案


如果您没有 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
| 编号 |
| ----: |
| 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
   编号 | 日期 | 姓名 | 状态日期         
----: | :----------------- | :--------------- | :-----------------
10001 | 2021-08-24 16:47:52 | 姓 姓 | 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
   编号 | 日期 | 姓名 | 状态日期         
----: | :----------------- | :--------------- | :-----------------
10001 | 2021-08-24 16:47:52 | 姓 姓 | 2021-09-02 10:01:13

db<>在这里摆弄


推荐阅读