mysql - 选择保存在另一个表中的具有指定状态的所有订单(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 有多个条目...所以该语句必须只选择最新的条目!?
解决方案
如果您没有 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<>在这里摆弄
推荐阅读
- javascript - 只需指向鼠标即可更改对象的颜色
- html - Jquery 认为我的
元素可见,即使显示设置为无和/或可见性设置为隐藏 - apache-spark - Spark 中的链 MinHash 和 LSH (BucketedRandomProjectionLSH) 用于近似距离和误报/误报
- google-app-engine - 是否可以在 Google App Engine 标准环境中使用 Argon2?
- javascript - Packery + Dragable UI 拖后排序
- javascript - d3源代码中带括号的赋值
- java - 当类路径中存在 eclipse moxy jar 时,不考虑 jersey jackson 提供程序
- reactjs - 在路由上显示登录组件,但如果用户不存在,也会显示
- hive - 为什么插入hdfs hive分区表时速度太慢?
- php - 速记如果疯狂,是否可以更聪明地重写?