2015-07-06 54 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的回答更详尽,但还是谢谢。 –