2009-09-22 55 views
1

有人能告訴我如何組合兩條SQL語句來計算消息的數量和未讀消息的數量?其無效的兩個有兩個陳述,但我不知道要尋找什麼來尋找答案。提前致謝。從存儲過程中檢索兩個值

CREATE PROCEDURE dbo.GetMessages (
    @username nchar(12), 
    @isCount bit, 
    @message_count int OUTPUT, 
    @unread_message_count int OUTPUT 
) AS 

IF @isCount = 1 
BEGIN 
    SET @message_count = 
    (
    SELECT  COUNT(*) 
    FROM   messages 
    WHERE   usernameTo = @username 
) 

    SET @unread_message_count = 
    (
    SELECT  COUNT(*) 
    FROM   messages 
    WHERE   usernameTo = @username AND message_read = 1 
) 
END 
ELSE 
BEGIN 
    SELECT  * 
    FROM   messages 
    WHERE   usernameTo = @username 
END 
+2

此過程基於一個參數的值返回非常不同的結果。這應該是兩個程序,而不是一個。如果這是應用程序的構建過程,我很害怕這個應用程序的其餘設計。 – Welbog 2009-09-22 12:22:54

+0

SQL不是我的專長,它對朋友網站有利。不需要優雅。 – 2009-09-22 12:27:33

+0

我不得不同意Welbog 110%。這是一個非常糟糕的設計!這會在稍後出現。 – 2009-09-22 12:28:47

回答

2

首先,您需要將其拆分爲兩個存儲過程。如果您曾經使用過一點點來確定要執行的代碼塊,那麼您可能試圖在一個存儲過程中插入太多內容。

CREATE PROCEDURE dbo.GetMessageCount (
    @username nchar(12), 
    @message_count int OUTPUT, 
    @unread_message_count int OUTPUT 
) AS 

SELECT 
    @message_count = SUM(CASE WHEN message_read = 1 THEN 1 ELSE 0 END), 
    @unread_message_count = SUM(CASE WHEN message_read <> 1 THEN 1 ELSE 0 END) 
FROM messages 
WHERE usernameTo = @username 

GO 

你可以爲存儲的程序做這樣的事情,它可以獲取特定用戶的所有消息。你不想在這裏使用「選擇*」。您應該始終列出您需要的特定列。我列舉了一些示例列。

CREATE PROCEDURE dbo.GetMessagesByUser (
    @username nchar(12) 
) AS 

    SELECT 
     MessageID, 
     MessageSubject, 
     MessageContent, 
     MessageFromUser, 
     MessageCreatedDate 
    FROM   messages 
    WHERE   usernameTo = @username 

GO 
+0

非常有幫助,謝謝。只有5列,我需要他們。感謝您的提示,雖然:) – 2009-09-22 12:36:42

+0

恕我直言,根本就不需要存儲過程。你所做的只是包裝一個查詢...... – wds 2009-09-22 12:45:40

+0

有些人喜歡確保所有的SQL調用都在SP中。我不相信這是必要的,但在許多工作場所當然是強制性的。如果你需要使用它,你可以這樣做。 – EndangeredMassa 2009-09-22 13:01:28

2
select count(*) as TotalCount, 
    count(case when message_read = 1 then 1 else null end) as ReadMessageCount, 
    count(case when message_read <> 1 then 1 else null end) as UnreadMessageCount 
from messages 
where usernameTo = 'jsmith' 
1

這取決於你使用的SQL,但是,例如,在PostgreSQL這將是這樣的:

SELECT 
    COUNT(*) AS messages, 
    COUNT(CASE WHEN message_read=1 THEN 1 ELSE NULL END) AS unreads, 
    COUNT(CASE WHEN message_read=1 THEN NULL ELSE 1 END) AS reads 
FROM messages WHERE usernameTo='someone'; 

這應該幫助。

0
SELECT COUNT(*) AS total_messages,  
     SUM(CASE WHEN message_read=1 THEN 1 END) as read, 
     SUM(CASE WHEN message_read=0 THEN 1 END) as unread 
FROM mesages WHERE usernameTo='username';