如何解决从右连接表中获取所有行
我正在努力获得以下格式的输出: 例如
| Total | Roles | Month | Year |
--------------------------------
| 52 | Admin |January| 2012 |
| 0 | Tester|July | 2012 |
| 41 | HR |January| 2014 |
| 0 | TL |June | 2015 |
| 14 | VP |march | 2011 |
我有两个表(比如用户和用户类型),这里用户表中的“类型”列是对用户类型表的引用。
我想从右连接表中获取所有行,如果左表中没有值,那么它应该显示“0”。
请在下面查看我尝试过的内容:
SELECT COALESCE(COUNT(u.`userId`),0) AS 'Total',r.`roleName` AS 'Role',COALESCE(MONTH(u.`userOn`),0) AS 'Month',COALESCE(YEAR(u.`userOn`),0) AS 'Year' FROM `users` u RIGHT JOIN `usertype` r ON u.`userRole` = r.`roleId` WHERE YEAR(`userOn`) > 2011 and u.`userRole` = r.`roleId` GROUP by r.`roleName`;
解决方法
将您的 YEAR(userOn) > 2011
条件放在 ON Clause
中,如下所示
SELECT COALESCE(COUNT(u.`userId`),0) AS 'Total',r.`roleName` AS 'Role'
FROM `usertype` r left join `users` u ON u.`userRole` = r.`roleId`
and YEAR(`userOn`) > 2011
GROUP by r.`roleName`;
,
Coalesce
不是必需的,您可以执行 right join
如下:
SELECT COUNT(u.`userId`) AS 'Total',r.`roleName` AS 'Role'
FROM `users` u
RIGHT JOIN `usertype` r ON u.`userRole` = r.`roleId`
and YEAR(u.`userOn`) > 2011
GROUP by r.`roleName`;
您必须在 YEAR(u.userOn) > 2011
子句中写入条件 ON
也可以用子查询来解决这个问题。 像这样:
Select
(select count(*) from users where userRole=roleId and YEAR(`userOn`) > 2011),rolename as Role
from usertype
,
函数不能使用索引,所以如果 useron 是索引的一部分(它当然应该是),那么这样的事情会更有效:
SELECT COALESCE(COUNT(u.userId),0) Total,r.roleName Role
FROM usertype r
LEFT
JOIN users u
ON u.userRole = r.roleId
AND u.userOn >= '2011-01-01'
GROUP
BY r.roleName
关于 (userOn,userRole) 的某种组合的索引似乎很合理
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。