我正在尝试获取正确的记录,但由于理由我在使用条款中遇到了一些问题,我想,有人可以帮助我吗?
案例1: 尝试选择order_id = 1(新订单)但不应该具有相同订单ID的多于1条记录的行
案例2: 选择order_id = 2(打印订单)的行,但也应选择新订单并应用CASE 1,换句话说,查询应选择order_id = 2的位置或者order_id = 1 if(order_id = 1则不应超过1条记录)具有相同的订单ID)
我有一张桌子,其中:
order_id =订单的身份
status_id =不同的状态id例如1 =新的,2 =打印,3 =处理等...
status_change_by =将订单状态从新更改为打印到处理的管理员的ID ...
order_id | status_id | status_change_by
1 | 1 | (NULL)
1 | 2 | 12
1 | 3 | 12
2 | 1 | (NULL)
3 | 1 | (NULL)
4 | 1 | (NULL)
1 | 4 | 13
5 | 1 | (NULL)
3 | 2 | (NULL)
这是我简单的mySQL查询:
SELECT * from order_tracking
where status_id = 1
group by order_id
having count(order_id) <= 2;
我甚至创建了SQL小提琴作为参考,请检查我是否做错了或者我需要使用CASE或IF语句进行复杂查询?
http://sqlfiddle.com/#!2/16936/3
如果此链接无效,请使用以下代码创建一个:
CREATE TABLE order_tracking
(
track_id int auto_increment primary key,
order_id int (50),
status_id int(20),
status_changed_by varchar(30)
);
这是插入内容:
INSERT INTO order_tracking
(order_id, status_id, status_changed_by)
VALUES
(1,1,''),
(1,2,12),
(1,3,12),
(2,1,''),
(3,1,''),
(4,1,''),
(1,4,13),
(5,1,''),
(3,2,'');
您应该感谢您的最早回复! 谢谢您的时间。
渴望结果:
案例:1 这很简单,结果应该是这样的:只有不超过1条记录的新订单
Order_id | status_id | status_changed_by
2 | 1 | (NULL)
4 | 1 | (NULL)
3 | 1 | (NULL)
案例2结果:
Order_id | status_id | status_changed_by
1 | 4(max id)| (NULL)
2 | 1 | (NULL)
4 | 1 | (NULL)
3 | 2(max id)| (NULL)
答案 0 :(得分:1)
通过在您的问题的行之间进行阅读,您希望显示每个订单ID的最高状态数值。也就是说,您的订单似乎从状态1进展到2到3等等。
这是你如何做到的。首先,您确定每个订单的最高状态,如下所示:
SELECT MAX(status_id) AS status_id,
order_id
FROM order_tracking
GROUP BY order_id
此查询为每个order_id提供一行,显示状态ID的最大值。
然后,将它用作子查询并像这样连接到原始表。 http://sqlfiddle.com/#!2/16936/11/0
SELECT o.order_id, o.status_id, o.status_changed_by
FROM order_tracking AS o
JOIN (
SELECT MAX(status_id) AS status_id,
order_id
FROM order_tracking
GROUP BY order_id
) AS m ON o.order_id = m.order_id AND o.status_id = m.status_id
ORDER BY o.order_id
这将为您提供每个订单的最高状态的良好结果。
| ORDER_ID | STATUS_ID | STATUS_CHANGED_BY |
|----------|-----------|-------------------|
| 1 | 4 | 13 |
| 2 | 1 | |
| 3 | 2 | |
| 4 | 1 | |
| 5 | 1 | |
请注意:如果您要将自动增量ID
列放入order_tracking
表格,那么事情可能会对您有所帮助。您可以为每个INSERT
获取最近order_id
个状态,而不是数字最高状态。在我看来,这对你的桌面布局是一个非常有用的改变。你这样做是这样的:
SELECT o.order_id, o.status_id, o.status_changed_by
FROM order_tracking AS o
JOIN (
SELECT MAX(id) AS id,
order_id
FROM order_tracking
GROUP BY order_id
) AS m ON o.id = m.id
ORDER BY o.order_id