【问题标题】:Get all the rows from the right joined table从右连接表中获取所有行
【发布时间】:2021-04-12 22:37:19
【问题描述】:

我正在努力获得以下格式的输出: 例如

| Total | Roles | Month | Year |
--------------------------------
| 52    | Admin |January| 2012 |
| 0     | Tester|July   | 2012 |
| 41    | HR    |January| 2014 |
| 0     | TL    |June   | 2015 |
| 14    | VP    |March  | 2011 |

我有两个表(比如 users 和 userType),这里 users 表中的“type”列是对 userType 表的引用。

我想从右连接表中获取所有行,如果左表中没有值,那么它应该显示“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`;

如何获取所提供输出的查询?

【问题讨论】:

  • 请注意,没有人使用 RIGHT JOIN

标签: mysql sql join foreign-keys


【解决方案1】:

函数不能使用索引,所以如果 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) 的某种组合的索引似乎是明智的

【讨论】:

    【解决方案2】:

    也可以使用子查询来解决这个问题。 像这样的:

    Select 
        (select count(*) from users where userRole=roleId and YEAR(`userOn`) > 2011),
        rolename as Role
    from  usertype
    

    【讨论】:

      【解决方案3】:

      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`;
      

      您必须在ON 子句中写入条件YEAR(u.userOn) > 2011

      【讨论】:

        【解决方案4】:

        将您的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`;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          • 2012-06-14
          • 2018-03-28
          • 2011-08-24
          • 2014-05-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多