1

关于 MySQL 查询,如何获取属于另一个表中条目组合的所有表条目?

背景:我想计算由订单项组成的订单。每个订单项目都具有“已取消”或“已交付”等状态。有部分交货,因此可以在一个订单中同时存在已交付和已取消的订单。我想计算净订单,我想知道有多少订单有多个项目状态的项目。

Order Number |  Order Item  |   Status

X0001        |  Item        |   delivered
X0001        |  Item        |   delivered
X0002        |  Item        |   delivered
X0002        |  Item        |   canceled
X0002        |  Item        |   delivered
X0003        |  Item        |   delivered

我在这里有 3 个有效订单和一个已交付/已取消的订单。我如何询问所有至少有一件已交付和一件已取消商品的订单?

由于我对 MySQL 很陌生,我基本上是在寻找正确的方法。我需要子查询或关节吗?

编辑:首先,很抱歉回复晚了。再次抱歉,因为我的问题显然具有误导性。

涉及三个表:“order”、“order_item”和“order_item_status”。

'order' 和 'order_item' 通过 'order_item.fk_order' 和 'order.id_order' 链接。

'order_item' 和 'order_item_status' 通过 'order_item.fk_order_item_status' 和 'order_item_status.id_order_item_status' 链接。

到目前为止,你一直很有帮助,但我仍然有点卡住,因为我不知道如何最终通过组合计数。完美的结果是这样的:

{shipped}            |  34
{canceled}           |  12
{shipped, canceled}  |  8
{closed, canceled}   |  4
{closed}             |  27
...                  |  ...

但我不知道如何处理查询中的组合。也许你对我有一些更有用的提示......

非常感谢。

4

4 回答 4

0

我不明白你为什么在谈论“另一个表中的条目组合”?根据您的以下问题,您有一个具有 - 至少 - 3 个属性的表:订单号、订单项目、状态。这是正确的还是另一个表中的一些属性,在这种情况下你能详细说明吗?

否则我会尝试使用子请求并执行以下操作:

SELECT T1.* FROM table T1 WHERE T1.status=canceled AND T1.order_number IN(SELECT T2.order_number FROM table T2 where T2.status=delivered)

于 2013-07-18T14:24:46.683 回答
0

我假设您的数据都在一个表中,就像您描述的那样。然后您想按订单号对数据进行分组,然后只获取已取消和已交付的订单?该请求还应如下所示:

select * from table \
group by Order Number \
Having State="canceled" and State="delivered"
于 2013-07-18T14:11:36.863 回答
0

我假设您有两个表:orders(您的订单列表) order_items(订单项列表)两个表由字段 fk_order 关联。

尝试这个:

SELECT o.id, (select count(*) from order_items i where i.status = 'delivered' and i.fk_order = o.id) as item_delivered, (select count(distinct i.status) from order_items i where i.fk_order = o.id) as status_no
FROM orders o
于 2013-07-18T14:07:43.453 回答
0

通过将表与同一个表连接,您可以选择具有不同值的行。然后计算不同的订单号。

SELECT COUNT(DISTINCT orig.Number)
FROM order_items AS 原件
INNER JOIN order_items AS diff ON diff.Number = orig.Number AND diff.Status != orig.Status

这比使用子查询要快。

编辑:忘了提到它是一个更具可扩展性的实现,并且您可以添加更多订单状态而不会失败。

于 2013-07-18T14:14:32.777 回答