选择属于另一个表中条目组合的表条目(mysql)

时间:2013-07-18 13:57:21

标签: mysql

关于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 个答案:

答案 0 :(得分:0)

我假设你有两张桌子: 订单(您的订单清单) 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

答案 1 :(得分:0)

我假设你的数据都在你描述的一个表中。那么您希望按订单号对数据进行分组,然后只获取取消和交付的订单? 请求也应该如下:

select * from table \
group by Order Number \
Having State="canceled" and State="delivered"

答案 2 :(得分:0)

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

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

这比使用子查询更快。

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

答案 3 :(得分:0)

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

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

SELECT T1。* FROM表T1 WHERE T1.status =已取消且T1.order_number IN(选择T2.order_number FROM表T2,其中T2.status =已交付)