2016-07-08 9 views
0

Ich habe zwei Tabellen, genannt vservers und nodes:Null-Wert nicht gezählt werden, wenn die Verbindung von zwei Tabellen

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 

Also, wenn es so manche vservers die keine Werte hat, werden sie nicht gezählt oder über PHP abgerufen.

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 

Mein zweiter Ansatz war dies auch, aber es gibt das gleiche Ergebnis:

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 

, aber immer noch gibt es das gleiche Ergebnis - Nullwerte sind nicht enthalten. EDIT: Bisher habe ich festgestellt, dass NULL-Werte nicht zählen. Also gibt es eine Funktion ISNULL, die sowohl NULL als auch reale Werte zählt. Das Problem ist, dass ich nicht weiß, wie ich es umsetzen soll.

Irgendwelche Vorschläge Jungs?

+0

du machst einen inneren beitreten. Sie müssen stattdessen einen Links-/Rechts-Join verwenden. inner join = records MÜSSEN in beiden Tabellen im Join existieren. links/rechts - Datensätze müssen in einer der Tabellen vorhanden sein, aber nicht notwendigerweise in der anderen. –

Antwort

1

Sie möchten eine LEFT JOIN anstelle einer INNER 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

Danke für die Antwort. Sowohl der LINKE als auch der RECHTE Join geben eine leere Ergebnismenge zurück. – fugitive

+0

Mir ist gerade aufgefallen, dass sich die 'WHERE' Bedingung auch auf' nodes' bezieht, so dass auch in die 'ON' Klausel gehen sollte. Ich habe das entsprechend bearbeitet. – VoteyDisciple

+0

Noch NULL-Werte werden @VoteyDisciple nicht gezählt – fugitive

0

Ich habe eine Lösung gefunden.

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 

Jetzt sind auch solche mit 0 Werten enthalten. Danke euch allen. :)