1

我正在尝试获取正确的记录,但出于某种原因,我猜我在 Have 子句中有一些问题,有人可以帮我吗?

案例 1: 尝试选择 order_id = 1(新订单)但不应有超过 1 条具有相同订单 ID 的记录的行

案例2: 选择order_id = 2(打印订单)的行,但也应该选择新订单并应用案例1,换句话说,查询应该选择where order_id=2 OR where order_id=1 if(order_id = 1 then should not have more超过 1 条具有相同订单 ID 的记录)

我有一张表,其中:
order_id = 订单的 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 fiddle 以供参考,请检查我是否做错了,或者我需要使用 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)
4

1 回答 1

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
于 2014-10-09T00:41:50.323 回答