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
目前我将一个订单的所有信息集中在一个 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