2012-02-05 28 views
1

我有四个表(结构,预留和结构成员,节点)。MySQL从另外两个表中计算表中的相关字段数

每个“节点”可能有零个或更多的“结构成员”(与其关联)。每个“面料”可能有零个或多个“面料”(与其相关)。 节点上可能有一个“保留”,并将其与单个“节点”相关联。

因此,你可以看到这些东西之间的引用时:

fabricmember.ipaddr = reservation.ipaddr 

fabricmember.fabric = fabric.fabricname

(你可以做到这一切,没有实际指的是“节点”)。

我想运行一个查询,它可以显示每个FABRIC的数量,有多少(总和)预订与它关联,以及它有多少(总和)结构成员。同样,在单个查询

我一直用下面的查询:

select 
    fabricmembers.fabric, 
    count(reservations.ipaddr) as Memebers, 
    count(nodes.ipaddr) as Reservations 
from fabricmembers 
LEFT JOIN (reservations,nodes) 
ON ((reservations.ipaddr = fabricmembers.ipaddr) and (nodes.ipaddr = fabricmembers.ipaddr)) 
GROUP BY (fabricmembers.fabric); 

几乎作品,但是如果织物具有成员,也有会员,但这些成员有零预留,结构根本不会显示在查询中。

下面的作品给我看的织物有多少成员,即使这个数字是零:

select fabricname,count(fabricmembers.ipaddr) 
from fabrics 
LEFT JOIN (fabricmembers) 
ON (fabrics.fabricname = fabricmembers.fabric) 
GROUP BY (fabrics.fabricname); 

然而,我无法弄清楚如何让查询也告诉我的数成员。

这是否有任何意义? 任何帮助,将不胜感激!

回答

1

您的查询不为零预订/零成员返回的面料,因为你正试图从表中建立它只有与面料保留/会员存在!唯一可以找到空布料的地方是布料桌 - 因此您应该从布料桌向下构建:

SELECT fabrics.fabricname, count(reservations.ipaddr), count(fabricmember.ipaddr) 
FROM fabrics 
LEFT JOIN fabricmembers ON fabrics.fabricname = fabricmembers.fabric 
LEFT JOIN reservations ON fabricmembers.ipaddr = reservations.ipaddr 
GROUP by fabric.fabricname 
+0

我完全理解你在说什么。我知道,我只是不知道如何处理它。我确实找到了解决方法,但你的看起来更优雅。我会在今晚晚些时候尝试。谢谢! – Brad 2012-02-06 21:33:14

0

您需要使用相关子查询此类似:

SELECT fabricmembers.fabric f, 
     (SELECT count(*) FROM reservations r where r.ipaddr = f.ipaddr) Members, 
     (SELECT count(*) FROM nodes n where n.ipaddr = f.ipaddr) Reservations 
FROM fabricmembers 
相关问题