Mysql 使用联接和计数从多个表中选择

Mysql 使用联接和计数从多个表中选择,mysql,sql,Mysql,Sql,我有三张桌子: 雇员 问题 信息 问题#1: 我想在问题表中显示所有有问题的员工。到目前为止,我已经做到了,但是我需要在messages表中显示他/她的所有消息,该表指示一个列名为\u 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表中

我有三张桌子:

  • 雇员
  • 问题
  • 信息
  • 问题#1:
    我想在问题表中显示所有有问题的员工。到目前为止,我已经做到了,但是我需要在messages表中显示他/她的所有消息,该表指示一个列名
    为\u 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表中显示未读邮件的计数。基础是列名_为_已读u,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个问题,而另一个问题还没有消息,我仍想显示它。

    切换外部联接表。将表M条件从
    WHERE
    移动到
    ON
    以获得真正的外部联接行为(否则其行为类似于常规的内部联接):

    我想在问题表中显示所有有问题的员工 我已经完成了,但是我需要在屏幕上显示他/她的所有消息 指示列名为\u read=0的Messages表

    我假设您希望显示所有未读的消息,但由于我不知道消息表中存在哪些列,因此我将只添加
    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
    
    这将列出所有有问题的员工,如果存在未读邮件(与问题相关),则会在主题中显示

    问题表中的每个问题都是消息表中的主题 我想显示邮件中未读邮件的数量 桌子基础是列名已读取,0表示尚未打开 1已被读取

    您正在通过where子句强制您的
    左连接
    成为
    内部连接
    。将一些逻辑移到join(比如@jarlh已经应答,但是两次声明同一个接收方似乎有点多余)


    稍微整理一下代码。第二个SQL代码段有不匹配的别名(
    C
    ?)第二个问题应该是使用未指定的C表名。对此表示抱歉。能否提供有关这些表结构和一些示例数据的详细信息?很难理解。也感谢您的回答。。尽管@mackan的答案更为详细。。还是谢谢你。
    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
    
    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