用于将两个表中的数据分组的SQL查询

用于将两个表中的数据分组的SQL查询,sql,mysql,aggregate-functions,Sql,Mysql,Aggregate Functions,我有三张桌子: 用户(id、名称) 订单(id、用户id) 订单\项目(id、订单id、状态) 首先,我想列出所有用户的订单数量,如下所示: A、 1订单 B、 5份订单 这很简单,我正在做一个“选择名称、计数(id)来自用户、订单,其中users.id=orders.userId按名称分组” 现在,我想进一步过滤这些数据,以仅显示订单中包含status=“unprocessed”项目的用户。我不知道如何对两个表中的数据进行分组。最后,我希望得到如下数据: (A未显示,没有订单,任何项

我有三张桌子:

  • 用户(id、名称)
  • 订单(id、用户id)
  • 订单\项目(id、订单id、状态)
首先,我想列出所有用户的订单数量,如下所示:

  • A、 1订单
  • B、 5份订单
这很简单,我正在做一个“选择名称、计数(id)来自用户、订单,其中users.id=orders.userId按名称分组”

现在,我想进一步过滤这些数据,以仅显示订单中包含status=“unprocessed”项目的用户。我不知道如何对两个表中的数据进行分组。最后,我希望得到如下数据:

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

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"
我现在正在测试,不太确定是否正确。 编辑:看起来不错

使用:

  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 
使用联接到
ORDERS\u ITEMS
需要在计数中使用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 

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

如果要从结果集中排除某些项目,则不希望使用外部联接。是否尝试过类似的操作:从用户、订单中选择名称、计数(id),orders\u items,其中users.id=orders.userId和orders.id=orders\u items.orderid和order\u items.status='unprocessed'按名称分组谢谢!成功了。我使用了第二种方法,因为第一种方法大约慢10倍。