一个表中来自其他两个表的相关字段的MySQL计数

一个表中来自其他两个表的相关字段的MySQL计数,mysql,sql,Mysql,Sql,我有四个表(结构、预订和fabricmembers、节点) 每个“节点”可能有零个或多个“fabricmembers”(与其关联)。 每个“结构”可能有零个或多个“fabricmembers”(与其关联)。 一个节点上可能有一个“保留”,它与一个“节点”相关联 因此,您可以在以下情况下看到这些事物之间的引用: fabricmember.ipaddr = reservation.ipaddr 及 fabricmember.fabric=fabric.fabricname (您可以在不实际引用“节

我有四个表(结构、预订和fabricmembers、节点)

每个“节点”可能有零个或多个“fabricmembers”(与其关联)。 每个“结构”可能有零个或多个“fabricmembers”(与其关联)。 一个节点上可能有一个“保留”,它与一个“节点”相关联

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

fabricmember.ipaddr = reservation.ipaddr

fabricmember.fabric=fabric.fabricname

(您可以在不实际引用“节点”的情况下执行所有这些操作)

我想运行一个查询,该查询可以显示每个结构的相关联的(sum)预订数量,以及它有多少(sum)fabricmembers。同样,在单个查询中

我一直在使用以下查询:

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);
但是,我不知道如何让查询同时告诉我成员的数量

这些有意义吗?
任何帮助都将不胜感激

您需要为此使用相关子查询,例如:

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

您需要为此使用相关子查询,例如:

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

您的查询不会返回具有零保留/零成员的结构,因为您试图从仅存在具有保留/成员的结构的表中构建它!唯一可以找到空结构的地方是结构表-因此,您应该从它向下构建它:

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

您的查询不会返回具有零保留/零成员的结构,因为您试图从仅存在具有保留/成员的结构的表中构建它!唯一可以找到空结构的地方是结构表-因此,您应该从它向下构建它:

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

我完全理解你的意思。我知道,我只是不知道如何处理它。我确实找到了解决方法,但你的看起来更优雅。今晚晚些时候我会试试这个。谢谢我完全理解你的意思。我知道,我只是不知道如何处理它。我确实找到了解决方法,但你的看起来更优雅。今晚晚些时候我会试试这个。谢谢