从两个表中分组数据的SQL查询

3

我有3个表:

  • 用户(id,name)
  • 订单(id,userId)
  • 订单_商品(id,orderId,status)

起初,我想列出所有用户及其相应的订单数量,如下所示:

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

这很简单,我正在执行“select name,count(id)from users,orders where users.id = orders.userId group by name”。

现在,我想进一步过滤此数据,仅显示具有具有状态=“未处理”的项目的订单的用户。 我不确定如何对来自2个表的数据进行分组。 最终,我要获取像以下的数据:

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

谢谢!


你尝试过这样的语句吗:SELECT name, count(id) from users, orders,orders_items WHERE users.id= orders.userId and orders.id=orders_items.orderid and order_items.status='unprocessed' GROUP BY name - Nervo Verdezoto
2个回答

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 

……由于一个订单中有多个未处理项目时,会出现行重复的情况……


谢谢!那个方法可行。我使用了第二种方法,因为第一种方法慢了大约10倍。 - siger

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"

我正在测试这个,不太确定我是否做对了。 编辑:看起来不错。


如果你想从结果集中排除某些内容,就不要使用外连接。 - OMG Ponies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接