用于对来自两个表的数据进行分组的SQL查询

时间:2010-10-24 01:25:02

标签: sql mysql aggregate-functions

我有3张桌子:

  • 用户(身份证,姓名)
  • 订单(id,userId)
  • Orders_Items(id,orderId,status)

首先,我想列出所有用户的订单数量,如下所示:

  • A,1个订单
  • B,5个订单

这很简单,我正在做一个“选择名称,来自用户的计数(id),其中的users.id = orders.userId group by name”。

现在,我想进一步过滤此数据,以便只显示订单中包含status =“unprocessed”的用户。我不知道如何分组来自2个表的数据。最后,我希望获得如下数据:

  • (未显示,没有状态=未处理的任何项目的订单)
  • B,3个订单(2个订单没有状态=未处理的项目)。

谢谢!

2 个答案:

答案 0 :(得分:1)

使用:

  SELECT u.name,
         COUNT(o.id) AS numOrders
    FROM USERS u
    JOIN ORDERS o ON o.userid = u.id
   WHERE EXISTS(SELECT NULL 
                  FROM ORDERS_ITEMS oi 
                 WHERE oi.orderid = o.id
                   AND oi.status = 'unprocessed')
GROUP BY u.name 

使用JOIN到ORDERS_ITEMS需要在COUNT中使用DISTINCT:

  SELECT u.name,
         COUNT(DISTINCT o.id) AS numOrders
    FROM USERS u
    JOIN ORDERS o ON o.userid = u.id
    JOIN ORDERS_ITEMS oi ON oi.orderid = o.id
                        AND oi.status = 'unprocessed'
GROUP BY u.name 

...因为订单中有多个未处理的商品时行重复...

答案 1 :(得分:0)

select name, count(users.id) from users 
left join orders 
on users.id=orders.userId 
left join orders_items 
on orders.id=orders_items.orderId 
where orders_items.status="unprocessed"

我现在正在测试,不太确定我是否正确。 编辑:似乎很好。