我正在使用以下查询返回如下结果:
SELECT subnets.subnet_id , INET_NTOA( subnets.address ) AS inet_address, subnet_masks.hosts, COUNT(addresses.STATUS) AS status_count
FROM subnets
LEFT JOIN subnet_masks ON subnets.mask_id = subnet_masks.mask_id
LEFT JOIN addresses ON subnets.subnet_id = addresses.subnet_id
WHERE addresses.status = 'allocated'
GROUP BY subnet_id
ORDER BY subnets.address
subnet_id inet_address hosts status_count
91 10.10.10.0 65534 3
71 192.168.1.0 254 6
90 192.168.10.0 254 1
Run Code Online (Sandbox Code Playgroud)
但是我希望它返回计数为0的行,就像这样:
subnet_id inet_address hosts status_count
91 10.10.10.0 65534 3
76 172.128.0.0 254 0
71 192.168.1.0 254 6
90 192.168.10.0 254 1
Run Code Online (Sandbox Code Playgroud)
我读到这可能是我的JOIN的一个问题,所以我尝试了很多不同的,我得到了相同的结果.有谁知道我做错了什么?
您的WHERE
子句正在过滤掉记录...将其移至您LEFT JOIN
的解决问题:
SELECT subnets.subnet_id , INET_NTOA( subnets.address ) AS inet_address, subnet_masks.hosts, COUNT(addresses.STATUS) AS status_count
FROM subnets
LEFT JOIN subnet_masks ON subnets.mask_id = subnet_masks.mask_id
LEFT JOIN addresses ON subnets.subnet_id = addresses.subnet_id AND addresses.status = 'allocated'
GROUP BY subnet_id
ORDER BY subnets.address
Run Code Online (Sandbox Code Playgroud)