簡體   English   中英

如何在C#中的一個SQL查詢中計算兩個條目?

[英]How do I count two entries in one SQL Query in C#?

我的ForumPost表中有兩列: IdThreadId

我想為特定用戶計算IdThreadId中的所有條目:

程式碼片段

cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = @"SELECT dbo.ForumPost.ThreadId, "
                    + "Id, "
                    + " COUNT(ForumPost.Id)AS PostCount AND (ForumPost.ThreadId)AS
                        ThreadCount"
                    + " FROM ForumPost "
                    + " WHERE UserName = @UserName ";
cmd.Parameters.Add(new SqlParameter("@UserName", ThreadUserName));
reader = cmd.ExecuteReader();

if (reader.HasRows)
{
    while (reader.Read())
    {
        int postCount = Convert.ToInt16(reader["PostCount"]);
        int threadCount = Convert.ToInt16(reader["ThreadCount"]);
        AllPosts = postCount + threadCount;
    }
}
reader.Close();

如果用戶可以具有不同的ThreadId計數和Id計數,則必須將其拆分為單獨的查詢。

SELECT COUNT(Id) as PostCount, UserName
WHERE UserName = '@UserName'
GROUP BY Id, UserName


SELECT COUNT(ThreadId) as ThreadCount, UserName
WHERE UserName = '@UserName'
GROUP BY Id, UserName

我在這里有點猜測,但是我想您希望統計用戶發表的帖子數量以及用戶參與的不同(不同)線程的數量:

SELECT 
    (
        SELECT COUNT(Id)
        FROM ForumPost
        WHERE UserName = @UserName
    ) AS PostCount,
    (
        SELECT COUNT(DISTINCT ThreadId)
        FROM ForumPost
        WHERE UserName = @UserName
    ) AS ThreadCount

當您使用COUNT(Column) ,在Column中具有非空值的每一行將計數+1。 因此,如果您SELECT COUNT(Id) as PostCount, COUNT(ThreadId) as ThreadCount ,則由於這兩個行分別計算了非null IdThreadId行數,因此很可能在兩個計數中獲得相同的數字。

您的意圖可能是想要統計用戶發布了多少個單個線程中的發布數,為此,您可以使用COUNT(DISTINCT Column)

cmd.CommandText = @"
   SELECT  COUNT(ForumPost.Id) AS PostCount 
      , COUNT(DISTINCT ForumPost.ThreadId) AS ThreadCount
   FROM ForumPost 
   WHERE UserName = @UserName ";

但是,尚不清楚您的實際意圖是什么,因為您也在將它與檢索Id和ThreadId混合使用。 您可能意味着您想要每個線程中的帖子總數,該個人用戶在他發布的任何線程中的帖子總數,或者您想要一個帖子列表總數(即兩個單獨的查詢)。 您需要解釋。

嘗試

SELECT COUNT(ForumPost.Id)AS PostCount AND (ForumPost.ThreadId)AS ThreadCount" 
                                    // + " COUNT(ForumPost.ThreadId)AS ThreadCount " 
                                     + " FROM ForumPost " 
                                     + " WHERE UserName = @UserName ";

您選擇的ID和ThreadID導致每個記錄都返回一條記錄,這就是為什么您得到重復計數的原因。

做就是了

從ForumPost那里選擇COUNT(*)UserName = @UserName;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM