具有多个联接条件的SQL计数数据
这是我的简化结构:具有多个联接条件的SQL计数数据,sql,postgresql,Sql,Postgresql,这是我的简化结构: 公司一个问题是最后一个连接是内部连接。使用左连接后,应继续使用左连接: SELECT c.id as company_id, COUNT(o.id) as orders_count_total FROM companies c LEFT JOIN users u ON u.belongs_to_company_id = c.id orders o LEFT JOIN ON c.id = o.users_company_id OR
公司一个问题是最后一个
连接是内部连接。使用左连接
后,应继续使用左连接
:
SELECT c.id as company_id, COUNT(o.id) as orders_count_total
FROM companies c LEFT JOIN
users u
ON u.belongs_to_company_id = c.id
orders o LEFT JOIN
ON c.id = o.users_company_id OR
(u.id = o.users_id AND
u.belongs_to_company_id = c.id AND
o.users_company_id is NULL
) LEFT JOIN
orders_orderstatus o_status
ON o.status_id = o_status.id AND
o_status.slug NOT IN ('slug1', 'slug2')
GROUP BY company_id;
我对此完全不确定,所以我把手指放在“Delete”键上,如果答案完全错误,我就准备用核武器攻击这个答案,但是你能做两个左连接,每个条件一个,然后合并吗
SELECT
c.id as company_id, COUNT(coalesce (o1.id, o2.id)) as orders_count_total
FROM
companies c
LEFT JOIN users u
ON u.belongs_to_company_id = c.id
LEFT JOIN orders o1
ON c.id = o1.users_company_id
left join orders o2 on
u.id = o2.users_id AND
u.belongs_to_company_id = c.id AND
o2.users_company_id is NULL
JOIN orders_orderstatus o_status
ON coalesce (o1.status_id, o2.status_id) = o_status.id AND
NOT (o_status.slug IN ('slug1', 'slug2'))
GROUP BY company_id
Count应该只计算非空结果,所以我认为这是可行的
如果不是,那么在CTE中合并相同的内容,然后在order status表中进行内部联接如何
with orders as (
SELECT
c.id as company_id, coalesce (o1.id, o2.id) as order_id
FROM
companies c
LEFT JOIN users u
ON u.belongs_to_company_id = c.id
LEFT JOIN orders o1
ON c.id = o1.users_company_id
left join orders o2 on
u.id = o2.users_id AND
u.belongs_to_company_id = c.id AND
o2.users_company_id is NULL
where
o1.id is not null or o2.id is not null
)
select
o.company_id, count (o.order_id) as orders_count_total
from
orders o
JOIN orders_orderstatus o_status on
o.order_id = o_status.id AND
NOT (o_status.slug IN ('slug1', 'slug2'))
GROUP BY company_id
我在连接中使用“或”条件的经验非常糟糕,除非原始条件是高度选择性的——您的条件似乎不是,因为您似乎想要两个完全不同的连接。但是在这种情况下,我将拥有所有订单,它们不会按订单状态过滤谢谢您的回答。不幸的是,它返回空表
with orders as (
SELECT
c.id as company_id, coalesce (o1.id, o2.id) as order_id
FROM
companies c
LEFT JOIN users u
ON u.belongs_to_company_id = c.id
LEFT JOIN orders o1
ON c.id = o1.users_company_id
left join orders o2 on
u.id = o2.users_id AND
u.belongs_to_company_id = c.id AND
o2.users_company_id is NULL
where
o1.id is not null or o2.id is not null
)
select
o.company_id, count (o.order_id) as orders_count_total
from
orders o
JOIN orders_orderstatus o_status on
o.order_id = o_status.id AND
NOT (o_status.slug IN ('slug1', 'slug2'))
GROUP BY company_id