使用连接从多个表中进行选择并计算

时间:2015-07-06 07:27:43

标签: mysql sql

我有3张桌子:

  1. 员工
  2. 问题
  3. 消息
  4. 问题#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个问题,而另一个没有消息,我还想继续显示它

2 个答案:

答案 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