2010-02-07 42 views
5

İki tabloya sahip olduğumu varsayalım. makaleler ve yorumlar.sql - left join - sayım

i makaleler tablo sütunlarından seçiyorum zaman, ben de ... aynı seçme açıklamada makale yorum sayısını seçmek istediğiniz

nasıl (bu iki tablo arasında ortak alan varsayalım articleid olan) bunu ben yaparım Yapabilirim ama yolumun verimli olup olmadığını bilmiyorum, bu yüzden doğru yolu öğrenmek istiyorum.

cevap

4

Kullanım: Eğer ARTICLES tablodan istersen sütunları

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

, sen çünkü onlar GROUP BY fıkrada tanımlamak gerekecek Onlarda gerçekleştirilen bir toplu işlev yok.

+1

Sadece grup ekleyerek yapmak her zaman en iyi şey değildir. Grupların kendi cümleleriyle 100'lü (tamam 100'lü değil, ancak bir LOT) sütun yazdığını, çünkü doğru şekilde nasıl kullanılacağını bilmediklerini görüyorum. Bu yüzden bir alt sorgu kullanarak bir çözüm gönderdim. – JonH

+0

@JonH: SQL Server (diğer DB'ler arasında) benzerleri, "GROUP BY" deyiminde tanımlama yapmadan, toplama işlevlerine (analitik işlevler kullanmadıkça) sarılmamış sütunları listelemenize/döndürmenize izin vermez. "GROUP BY" yan tümcesini atlarsanız, sağlanan **, SQL Server'da sağlanan hataya ** sahip olacaksınız. MySQL, bu işlevselliği destekleyen tek DB'dir ve standart değildir: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

+0

Bir çok insan grubun ve topluluğun nasıl çalıştığını anlamıyordu. Doğru sonucun ne olabileceğini düşündükleri şeyi elde etmek için 100'lerce sütunla insanlar grubunu gördüm. – 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

senin alt sorguda hiçbir articleID olmadığı için bu işe yaramaz .. –

+0

Yani bir çok basit şeyler ekleyin. – JonH

+0

@Gaby - makale kimliğini göstermek için düzenlenmiştir. – JonH

2

Bu yapmalıyım ..

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

Muhtemelen GROUP BY. Herhangi biri söz konusu olduğunda, birleşik kayıt olmaması durumunda bu 0 değerini düzgün bir şekilde döndürecektir. – dkretz

+0

'le dorfier' doğru - bu sorgu, SQL Server'da olduğu gibi çalışmayacak. –

+0

evet gerçekten çocuklar ... çalışmak için düzenlenmiş .. –

7

Bu, daha verimli olmalıdır çünkü grup yalnızca Yorum tablosunda yapılır.

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;