用于将两个表中的数据分组的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份订单
- (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倍。