2016-01-29 52 views
0

我有3个表:问题与SQL加盟

enter image description here

我有这个到目前为止已经试过:

SELECT T1.P_id as id, T2.D_id, COALESCE(T2.count , 0) AS count 
FROM 
(
    SELECT DISTINCT P_id FROM Comp_prod WHERE company_id = '15' 
) AS T1 
LEFT JOIN 
(
    SELECT D_id, P_id, COUNT(P_id) AS count 
    FROM userlogs 
    WHERE company_id = '15' 
     AND date BETWEEN 'daterstart' AND 'dateend' 
    GROUP BY D_id, P_id 
) AS T2 ON T2.P_id = T1.P_id 

这是行不通的,因为我需要连接到另一个表:

部门

我怎样才能有另一个子查询?

任何解决方案?它的MySQL我使用

回答

1

希望这有助于

select 
     sub.C_id,sub.D_id,sub.P_id,count(Userlogs.D_id) 
from 
     (select Comp_prod.C_id,D_id,P_id from Comp_prod join Departments on 
     Comp_prod.C_id = Departments.C_id ORDER by Comp_prod.C_id asc, 
     Departments.D_id ASC, Comp_prod.P_id ASC) as sub 
    left join Userlogs 
     on 
      sub.C_id = Userlogs.C_id and sub.D_id = Userlogs.D_id 
      and sub.P_id = Userlogs.P_id 
group by 
     sub.C_id,sub.D_id,sub.P_id 
+0

这个查询有问题,给出错误。我似乎无法弄清楚 –

+0

有什么错误? [链接](http://sqlfiddle.com/#!9/4791d/1) –

+0

它终于奏效了!条件很少,但效果很好。谢谢 –

1

您可以生成所有行,使用cross join然后在现有的成果带来(如果有的话)聚集:

select d.c_id, d.D_id, p.P_id, count(ul.c_id) as cnt 
from comp_prod p cross join 
    departments d left join 
    user_logs ul 
    on ul.c_id = d.c_id and ul.d_id = d.d_id and ul.p_id = p.p_id 
group by d.c_id, d.D_id, p.P_id; 
+0

这是不能做出正确的结果 –

+0

@ user4499992。 。 。您的评论含糊不清。你的示例代码有一个格式错误的where子句。您应该在'on'子句中将正在工作的'where'子句放入此查询中。 –

+0

选择d.company_id,d.id,p.product_id,从有限公司_产品PPP交叉计数(ul.company_id)作为CNT 加入 部门ð左加入 userlogs UL 上ul.company_id = d.company_id \t和UL。部门标识= d.id \t和ul.product_id = p.product_id \t和ul.company_id = '15' \t和ul.created_at BETWEEN '2016年1月1日' 与 '2016年1月29日' 组由d.company_id,d.id,p.product_id –

1

正常comp_prod和C_id部门之间的内部连接会给你所有这些组合(你可以在WHERE子句中将其缩小到15的C_id),然后LEFT OUTER JOIN user_logs来获得匹配的结果。使用COUNT(C_ID),所以你指望在那里找到匹配的行数(即C_ID不为null)

SELECT Comp_prod.C_id, 
     Departments.D_id, 
     Comp_prod.P_id, 
     COUNT(Userlogs.C_id) 
FROM Comp_prod 
INNER JOIN Departments 
ON Comp_prod.C_id = Departments.C_id 
LEFT OUTER JOIN Userlogs 
ON Comp_prod.C_id = Userlogs.C_id 
AND Comp_prod.P_id = Userlogs.P_id 
AND Departments.D_id = Userlogs.D_id 
WHERE Comp_prod.C_id = 15 
GROUP BY Comp_prod.C_id, 
     Departments.D_id, 
     Comp_prod.P_id 
+0

对不起,我试过了,但似乎不能得到赖特的结果?它只显示P_id存在于Userlogs中,即使它不存在也需要显示为'0' –

+0

查询看起来不错,也许我缺少一个条件?或GROUP BY? –

+0

只需要捕获COUNT为NULL,如果是这样就输出0.所以使用_COALESCE(COUNT(Userlogs.C_id),0)_。 – Kickstart