2015-07-06 84 views
-1

我有3個表:選擇加入和計數

  1. 員工
  2. 問題
  3. 消息

問題1:
我要顯示所有在問題表中存在問題的員工。我做到了這一點,但我需要在消息表中顯示所有他/她的消息,其中指示列名稱is_read = 0

SELECT distinct E.NAME, E.EMP_ID 
FROM ISSUES I 
INNER JOIN EMPLOYEE E ON E.EMP_ID = I.RECEIVER ORDER BY E.NAME ASC 

問題2:
已發行表中的每個問題是郵件表中的問題,我想顯示在消息表未讀郵件的數量。基礎是列名_is_read_,0表示尚未打開,1已被讀取。

下面是我已經做到了,但有一些錯誤是:

SELECT I.SUBJECT, COUNT(M.IS_READ) AS UN_READ 
FROM MESSAGES M 
LEFT JOIN ISSUES I ON I.ID = M.ISSUE_ID 
WHERE I.RECEIVER = '1234' AND M.IS_READ = 0 and M.RECEIVER = '1234' 
GROUP BY I.SUBJECT 

輸出:

SUBJECT     UN_READ 
Always Absent   13 
Attendance Incomplete 1 
Pending Requirements 6 

錯誤的,因爲員工有問題表4期和另一個有沒有消息還沒有,我想仍然顯示它。

+0

清理了一下代碼。第二個SQL代碼片段有不匹配的別名('C'?) – Mackan

+0

第二個問題應該是使用c表名不指定 –

+0

哦對不起。 –

回答

0

我要顯示所有已在問題表 我一個問題員工使它到目前爲止,但我需要在 信息表,該表示出列名,以顯示他/她所有的消息is_read = 0

我假設你要顯示的所有未讀郵件,但因爲我不t知道中存在哪些列消息表格我將僅添加M.Subject作爲虛擬列。

SELECT DISTINCT E.NAME, E.EMP_ID, M.Subject 
FROM ISSUES I 
INNER JOIN EMPLOYEE E ON E.EMP_ID = I.RECEIVER 
LEFT JOIN MESSAGES M ON M.ISSUE_ID = I.ID AND M.IS_READ = 0 
ORDER BY E.NAME ASC 

這將列出所有員工問題,如果存在未讀消息(連接問題),它會顯示在主題

已發行表中的每個問題是郵件表 的問題,我想在消息 表中顯示未讀郵件的數量。基礎是列名is_read,0表示尚未打開 並且1已被讀取。

您正在迫使你的LEFT JOIN通過where子句變成INNER JOIN。將一些邏輯移到連接上(就像@jarlh已經回答了一樣,但是兩次聲明同一個接收器似乎有點多餘)。

SELECT I.SUBJECT, COUNT(M.IS_READ) AS UN_READ 
FROM ISSUES I 
LEFT JOIN MESSAGES M ON M.ISSUE_ID = I.ID AND 
         M.RECEIVER = I.RECEIVER AND 
         M.IS_READ = 0 
WHERE I.RECEIVER = '1234' 
GROUP BY I.SUBJECT 
0

切換外部連接表。移動圖表M條件從WHEREON得到真正的外部聯接行爲(否則它的行爲作爲一個經常性內部連接):

SELECT I.SUBJECT, COUNT(M.IS_READ) AS UN_READ 
FROM ISSUES I 
    LEFT JOIN MESSAGES M 
    ON I.ID = M.ISSUE_ID AND M.IS_READ = 0 and M.RECEIVER = '1234' 
WHERE I.RECEIVER = '1234' 
GROUP BY I.SUBJECT 
+0

也謝謝你的回答..雖然@mackan的回答更詳盡,但還是謝謝。 –