MySQL从另外两个表中计算表中的相关字段

时间:2012-02-05 22:32:05

标签: mysql sql

我有四个表(结构,预留和结构成员,节点)。

每个"节点"可能有更多的" fabricmembers" (与之相关)。 每个"面料"可能有零个或多个" fabricmembers" (与之相关)。 一个节点可能有一个"预留"在它上面,将它与一个"节点"。

相关联

因此,您可以在以下情况下看到这些内容之间的引用:

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);

这个几乎有效,但是如果一个结构有成员,或者它有成员但这些成员有ZERO保留,则结构根本不显示在查询。

以下作品向我展示了一个结构有多少成员,即使该数字为零:

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

但是,我无法弄清楚如何让查询告诉我成员的数量。

这有什么意义吗? 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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