【发布时间】:2011-01-14 00:25:53
【问题描述】:
假设我有两张桌子。文章和cmets。
当我从articles表中选择列时,我还想在同一个select语句中选择文章上的cmets数量......(假设这两个表之间的公共字段是articleid)
我该怎么做?我可以完成它,但我不知道我的方法是否有效,所以我想学习正确的方法。
【问题讨论】:
标签: sql sql-server tsql join
假设我有两张桌子。文章和cmets。
当我从articles表中选择列时,我还想在同一个select语句中选择文章上的cmets数量......(假设这两个表之间的公共字段是articleid)
我该怎么做?我可以完成它,但我不知道我的方法是否有效,所以我想学习正确的方法。
【问题讨论】:
标签: sql sql-server tsql join
这应该更有效,因为 group by 只在 Comment 表上完成。
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
【讨论】:
用途:
SELECT a.articleid,
COUNT(*) AS num_comments
FROM ARTICLES a
LEFT JOIN COMMENTS c ON c.articleid = a.articleid
GROUP BY a.articleid
无论您想从ARTICLES 表中获得什么列,都必须在GROUP BY 子句中定义,因为它们没有对它们执行聚合函数。
【讨论】:
GROUP BY 子句,您将根据所提供的内容在 SQL Server 上收到错误。 MySQL 是唯一支持此类功能的数据库,并且它是非标准的:dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
应该这样做..
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
【讨论】:
le dorfier 正确 - 此查询不会在 SQL Server 上按原样运行。
-- 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;
【讨论】:
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
【讨论】: