MySQL Group by和Having子句问题

纳德姆

我正在尝试获取正确的记录,但是由于某种原因,我猜我在Haveing子句中遇到问题,有人可以帮助我吗?

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

案例2:选择order_id = 2(印刷订单)的行,但也应该选择新订单并应用案例1,换句话说,查询应选择order_id = 2或where order_id = 1 if(order_id = 1则不应有更多订单)多于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提琴供参考,请检查我做错了还是需要使用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)
琼斯

似乎,通过在问题的各行之间阅读,您想要显示每个订单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 |                   |

请注意:如果您要IDorder_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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL是否消除SELECT和HAVING / GROUP BY子句之间的公共子表达式

来自分类Dev

MySQL GROUP BY和SUM排名

来自分类Dev

MySQL GROUP BY和SELECT GROUP BY

来自分类Dev

MySQL group_concat与where子句

来自分类Dev

MySQL嵌套查询和GROUP BY

来自分类Dev

MySQL COUNT和GROUP BY

来自分类Dev

mysql存储过程构造与GROUP_CONCAT和IN子句

来自分类Dev

mysql中的group by子句问题

来自分类Dev

没有GROUP BY子句的MySQL聚合函数

来自分类Dev

MySQL:计算if和Group By

来自分类Dev

MySQL group_concat问题

来自分类Dev

MYSQL GROUP BY和WHERE子句

来自分类Dev

无法删除带有GROUP BY和HAVING子句的语句

来自分类Dev

Mysql加入group by和order by

来自分类Dev

使用group by和having子句获取最大倍数行

来自分类Dev

使用GROUP_CONCAT和IN子句的mysql存储过程构造

来自分类Dev

mysql中的group by子句问题

来自分类Dev

MYSQL:ORDER BY的GROUP BY问题

来自分类Dev

在mysql中使用join和group by子句

来自分类Dev

MYSQL:在group by子句中获取零值

来自分类Dev

MySQL:group子句有多个列

来自分类Dev

MySQL更新与GROUP和ORDER

来自分类Dev

MySQL查询GROUP BY和ORDER by

来自分类Dev

奇怪的Having和Group By子句行为生成“'having'子句中的未知列”错误

来自分类Dev

使用join子句和group by子句的mysql查询

来自分类Dev

JOIN, GROUP BY, SUM 问题 Mysql

来自分类Dev

组合group by和count mysql

来自分类Dev

MySQL ORDER BY 和 GROUP BY

来自分类Dev

Mysql查询结合join、group by、have和order by子句