2016-07-08 4 views
0

나는 두 개의 테이블이 결합 할 때, 계산 vserversnodes 호출되지 않습니다 :널 값은 두 개의 테이블

vservers :

vserverid **PK** | nodeid **FK** 
1    5 
2    6 
3    7 

nodes :

nodeid | name  | maxvps 
5  some_name 4 
6  some_name 4 
7  some_name 4 

가 그렇다면 일부를 vservers에는 값이 없으므로 PHP를 통해 카운트되거나 페치되지 않습니다.

SELECT nodes.name as name, COUNT(vservers.vserverid) as count_vps ,nodes.maxvps 
FROM nodes, vservers 
WHERE vservers.nodeid = nodes.nodeid 
AND nodes.name LIKE 'some_name%' 
GROUP BY name 

내 두 번째 방법은뿐만 아니라이 있었다, 그러나 같은 결과를 반환합니다

SELECT nodes.name as name, COUNT(*)- COUNT(vservers.vserverid) as count_vps, nodes.maxvps 
FROM nodes, vservers 
WHERE vservers.nodeid = nodes.nodeid 
AND nodes.name LIKE 'some_name%' 
GROUP BY name 

을하지만 여전히 같은 결과를 제공 - null 값이 포함되어 있지 않습니다. EDIT : 지금까지 NULL 값이 중요하지 않다는 것을 알았습니다. 따라서 NULL과 실제 값을 모두 계산하는 함수 ISNULL이 있습니다. 문제는 그것을 구현하는 방법을 모른다는 것입니다.

의견이 있으십니까?

+0

내부 조인을하고 있습니다. 대신 왼쪽/오른쪽 조인을 사용해야합니다. 내부 조인 = 레코드는 조인의 두 테이블에 모두 존재해야합니다. 왼쪽/오른쪽 - 레코드는 테이블 중 하나에 있어야하지만 다른 테이블에 반드시 있어야하는 것은 아닙니다. –

답변

1

INNER JOIN 대신 LEFT JOIN이 필요합니다.

SELECT nodes.name as name, COUNT(vservers.vserverid) as count_vps ,nodes.maxvps 
FROM vservers 
LEFT JOIN nodes ON(vservers.nodeid = nodes.nodeid AND nodes.name LIKE 'some_name%') 
GROUP BY name 
+0

응답 해 주셔서 감사합니다. LEFT와 RIGHT 조인 모두 빈 결과 세트를 리턴합니다. – fugitive

+0

나는'WHERE' 조건이'nodes'를 참조하여'ON' 절에 들어가야한다는 것을 눈치 챘습니다. 그에 따라 편집했습니다. – VoteyDisciple

+0

여전히 NULL 값은 계산되지 않습니다 @VoteyDisciple – fugitive

0

해결책을 찾았습니다.

SELECT nodes.name, COUNT(vservers.vserverid) AS max_vps 
FROM vservers 
RIGHT OUTER JOIN nodes 
ON vservers.nodeid = nodes.nodeid 
WHERE nodes.name LIKE "node_name%" 
GROUP BY name 

이제 값이 0 인 것도 포함됩니다. 다들 감사 해요. :)