Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个联接条件的SQL计数数据_Sql_Postgresql - Fatal编程技术网

具有多个联接条件的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