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表中
我想在问题表中显示所有有问题的员工。到目前为止,我已经做到了,但是我需要在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