簡體   English   中英

從右連接表中獲取所有行

[英]Get all the rows from the right joined table

我正在努力獲得以下格式的 output:例如

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

如何獲取提供的 output 的查詢?

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

您必須在ON子句中寫入條件YEAR(u.userOn) > 2011

也可以使用子查詢來解決這個問題。 像這樣的東西:

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) 的某種組合的索引似乎是明智的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM