php - wert - vb net sql prüfen ob datensatz vorhanden




MySQL Count gibt 0 nicht zurück, wenn kein Datensatz gefunden wurde (2)

Fragen Sie die post-Tabelle ab und führen Sie eine Unterabfrage für die Anzahl der Kommentare aus.

SELECT post.post_id, (SELECT COUNT(comment) FROM `comment` WHERE `comment`.post_id = post.post_id) as comments FROM post

Dies kann bei Lots oder Zeilen extrem langsam werden, also fügen Sie ein Limit mit einem Pager hinzu, wenn Sie zu diesem Punkt kommen.

Obwohl ich zu diesem Thema recherchiert habe und auf einige Lösungen wie die Verwendung von JOIN LEFT oder Unterabfragen gestoßen bin, kann ich immer noch nicht das gewünschte Ergebnis erzielen, da ich in mySQL nicht stark bin. Ich bin mehr ein Webdesigner, der versucht, einfacheres PHP zu meiner Website besser für ein Schulprojekt zu verwenden.

Ich versuche eine Webanwendung zu erstellen, die einem Blog ähnlich ist. Ich wollte zählen, wie viele Kommentare für einen Beitrag vorhanden sind, und die Nummer anzeigen, die meine Benutzer sehen können. Wenn es für diese Zeile jedoch keinen Kommentar gibt, gibt meine Abfrage nichts statt 0 zurück.

Dies ist meine Abfrage unten:

SELECT post.post_id, COUNT(comment) 
FROM `comment`, post 
WHERE `comment`.post_id = post.post_id 
GROUP BY post.post_id

Das Ergebnis:

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 15      | 1
4      | 16      | 1

Wie Sie sehen können, hat post_id 14 keine Kommentare, daher gibt meine Abfrage nichts zurück. Was muss ich tun, damit mein Ergebnis so aussieht?

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 14      | 0
4      | 15      | 1
5      | 16      | 1

Außerdem wäre es nett von euch, mir Referenzen oder Links zu geben, um das Konzept hinter der Lösung zu verstehen, da ich mehr über PHP erfahren möchte :)


Also, wenn du das tust (was du tust, neu formuliert für den JOIN):

SELECT post.post_id, COUNT(comment) 
FROM `comment`
INNER JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id;

Sie sammeln nur Post-Zeilen mit mindestens einer Referenz im Kommentar.

Wenn Sie den JOIN-Typ in einen LINKEN Join ändern, gehen Sie wie folgt vor:

SELECT post.post_id, COUNT(comment) 
FROM `comment`
LEFT JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id;

Dann sind die Zeilen aus dem Post alle da, und NULL-Werte werden für Spalten von Kommentaren eingefügt, wenn keine Kommentare zu dieser Zeile existieren (das ist ein linker Join). Wenn also der Kommentar eine Spalte aus dem Tabellenkommentar ist, wird er für jede Zeile der Post-Tabelle vorhanden sein, aber mit einem NULL-Wert nach der Gruppe nach der Spalte post_id enthält die Teilmenge von Kommentaren zu diesem Beitrag nur 1 NULL-Wert, die Anzahl sollte 0 zurückgeben.

select count(NULL);

gibt 0 zurück.

Jetzt könnten Sie eine Unterabfrage verwenden, aber das ist eine wirklich schlechte Idee, Unterabfragen werden normalerweise anstelle von LINKEN VERBINDUNGEN gemacht, normalerweise ist es ein Fehler , manchmal ist es nicht, aber es ist wirklich oft ein Fehler. Wenn Sie einen Link-Join-Index verwenden, werden die Schlüsselwerte der beiden Tabellen (die ON-Klausel) verglichen und ein endgültiges "Temporäres" -Ergebnis von Zeilen erstellt, wobei Werte aus beiden Tabellen gemischt werden (und dann oder vielleicht zur selben Zeit). die Filter aus anderen Teilen Ihrer Abfragen werden angewendet). Wenn Sie eine Unterabfrage verwenden, wird für jede Zeile der ersten Tabelle eine neue Abfrage ausgeführt, um Ergebnisse aus der zweiten Tabelle zu erhalten (nicht immer, aber es ist ein anderes Problem), die Kosten sind für das Datenbankmodul immer größer.





record