关于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
... | ...
但我不知道如何处理查询中的组合。也许你对我有更多有用的提示......
非常感谢。
答案 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 =已交付)