2010-02-07 14 views
5

Angenommen, ich habe zwei Tabellen. Artikel und Kommentare.sql - links beitreten - zählen

wenn ich Spalten von Artikeln Tabelle auswählen, ich möchte auch die Anzahl der Kommentare zu dem Artikel in der gleichen SELECT-Anweisung wählen ... (nehme an das gemeinsame Feld zwischen diesen beiden Tabellen ist articleid)

wie tue ich das? Ich kann es schaffen, aber ich weiß nicht, ob mein Weg effizient wäre, also möchte ich den richtigen Weg lernen.

Antwort

4

Verwendung:

SELECT a.articleid, 
      COUNT(*) AS num_comments 
    FROM ARTICLES a 
LEFT JOIN COMMENTS c ON c.articleid = a.articleid 
GROUP BY a.articleid 

Was Spalten aus der ARTICLES Tabelle wollen, werden Sie in der GROUP BY Klausel, weil sie definieren müssen haben keine aggregierte Funktion an ihnen ausgeführt.

+1

Nur Gruppe hinzufügen ist nicht immer die beste Sache zu tun. Ich sehe Leute schreiben Abfragen mit 100s (ok nicht 100, aber eine Menge) von Spalten in ihrer Gruppierung nach Klausel, weil sie nicht wissen, wie Aggregate richtig zu verwenden. Deshalb habe ich eine Lösung mit einer Unterabfrage gepostet. – JonH

+0

@JonH: SQL Server (ähnlich wie andere DBs) erlaubt Ihnen nicht, Spalten aufzulisten/zurückzugeben, die nicht in Aggregatfunktionen eingeschlossen sind (sofern keine analytischen Funktionen verwendet werden), ohne sie innerhalb der GROUP BY-Klausel zu definieren. Wenn Sie die Klausel GROUP BY weglassen, erhalten Sie ** eine Fehlermeldung auf SQL Server basierend auf dem, was zur Verfügung gestellt wird. MySQL ist die einzige DB, die solche Funktionalität unterstützt, und es ist nicht Standard: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

+0

Ich weiß, dass mein Punkt Viele Leute verstehen nicht, wie Gruppenarbeit und Aggregate funktionieren. Ich habe Menschen in 100er Spalten gruppieren sehen, nur um zu bekommen, was sie für das richtige Ergebnis halten. – JonH

0
SELECT 
     a.Article, 
     a.ArticleID, 
     t.COUNTOFCOMMENTS 
FROM 
     Article a 
LEFT JOIN 
     Comment c 
ON c.ArticleID=a.ArticleID 
LEFT JOIN 
(SELECT ArticleID, COUNT(CommentID) AS COUNTOFCOMMENTS FROM Comments GROUP BY ArticleID) t 
ON t.ArticleID = a.ArticleID 
+0

Das wird nicht funktionieren, da es keine articleID in Ihrer Unterabfrage ist .. –

+0

So ein sehr einfaches Material hinzuzufügen. – JonH

+0

@Gaby - bearbeitet, um die Artikel-ID anzuzeigen. – JonH

2

Dies sollte es tun ..

SELECT 
    article_column_1, article_column_2, count(ct.articleid) as comments 
FROM 
    article_table at 
    LEFT OUTER JOIN comment_table ct ON at.articleid = ct.articleid 
GROUP BY 
    article_column_1, article_column_2 
+1

Sie möchten wahrscheinlich eine GROUP BY. Falls jemand betroffen ist, wird 0 korrekt zurückgegeben, wenn keine verknüpften Datensätze vorhanden sind. – dkretz

+0

'le dorfier' ist korrekt - Diese Abfrage wird nicht auf SQL Server-as-is ausgeführt. –

+0

ja in der Tat Jungs ... bearbeitet, um zu arbeiten .. –

7

Dies sollte effizienter sein, da die Gruppe nach nur in der Kommentartabelle ausgeführt wird.

SELECT 
     a.ArticleID, 
     a.Article, 
     isnull(c.Cnt, 0) as Cnt 
FROM Article a 
LEFT JOIN 
    (SELECT c.ArticleID, count(1) Cnt 
    FROM Comment c 
    GROUP BY c.ArticleID) as c 
ON c.ArticleID=a.ArticleID 
ORDER BY 1 
0
-- Working Syntax example from my environment changed to fit this context. 
SELECT a.article 
    ,A.articleid 
    ,(
     SELECT Count(B.articleid) 
     FROM dbo.comment AS B 
     WHERE A.articleid = B.articleid 
     ) AS comment# 
    ,(
     SELECT Count(C.articleid) 
     FROM dbo.comments AS C 
     WHERE A.articleid = C.articleid 
     ) AS comments# 
FROM dbo.article AS A;