我有3张桌子:
问题#1:
我想显示问题表中存在问题的所有员工。我做到目前为止,但我需要在Messages表中显示所有他/她的消息,这表示列名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:
对于Issue表中的每个问题都是Messages表中的主题,我想在Messages表中显示未读消息的数量。基础是列名_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
错了,因为员工 1234 在问题表中有 4个问题,而另一个没有消息,我还想继续显示它
答案 0 :(得分:0)
切换外部联接表。将表M条件从WHERE
移动到ON
以获得真正的外部联接行为(否则它表现为常规内部联接):
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
答案 1 :(得分:0)
我想显示问题表中存在问题的所有员工 我做到目前为止,但我需要显示他/她的所有消息 消息表,表示列名is_read = 0。
我假设您要显示所有未读消息,但由于我不知道 Message 表中存在哪些列,因此我只需添加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
这将列出具有问题的所有员工,如果存在未读邮件(连接到问题),它将显示在主题
对于Issue表中的每个问题都是Messages表中的主题 我想在消息中显示未读消息的数量 表。基础是列名is_read,0表示尚未打开 已经读过1个。
您通过where子句强迫LEFT JOIN
成为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