1. 程式人生 > >######SQL多count查詢(不用子查詢,條件加對了就行)(注意:條件位置可變化。)》分析領導的實現過程。心得筆記。

######SQL多count查詢(不用子查詢,條件加對了就行)(注意:條件位置可變化。)》分析領導的實現過程。心得筆記。

===》分析領導的實現過程。心得筆記。



#業務場景:不同企業下有各自的角色。角色下有許可權(角色:許可權=多對多,有中間表)和使用者(角色:使用者=一對多,使用者表有個角色id)
#表結構:看檔案。
#需求:登入使用者所屬企業id,

 #1
SELECT a.PB_ROL_code,a.PB_ROL_name, b.PB_UCT_nickname,COUNT(b.PB_UCT_no)   -- , c.PB_PER_code,COUNT(c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno AND  a.PB_ROL_ownedcomno = 8000002
LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno GROUP BY a.PB_ROL_code
 #1 V2
SELECT a.PB_ROL_code,a.PB_ROL_name, b.PB_UCT_nickname,COUNT(b.PB_UCT_no)   -- , c.PB_PER_code,COUNT(c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno 
LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno GROUP BY a.PB_ROL_code
-- WHERE a.PB_ROL_ownedcomno = 8000002  #語法報錯。
 WHERE m.PB_CMB_comno = 8000002 #語法報錯。
#1 V3
SELECT a.PB_ROL_code,a.PB_ROL_name, b.PB_UCT_nickname,COUNT(b.PB_UCT_no)   -- , c.PB_PER_code,COUNT(c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno 
LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno 
 WHERE a.PB_ROL_ownedcomno = 8000002  # 或 WHERE m.PB_CMB_comno = 8000002  都一樣。
-- 只要條件加對了,就行!!!(條件的位置調整+SQL基礎語法)【where提取到最後(不放在查詢角色後面),group by 必須要放到where後面。】
GROUP BY a.PB_ROL_code

#1 V3 》基礎上 新增 統計 許可權個數。ok 
SELECT a.PB_ROL_code,a.PB_ROL_name, b.PB_UCT_nickname,COUNT( DISTINCT b.PB_UCT_no), c.PB_PER_code,COUNT(DISTINCT c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno 
LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno 
LEFT JOIN pb_perole c ON c.PB_ROL_code = a.PB_ROL_code   #1 V3 基礎上 新增 統計 許可權。
 WHERE a.PB_ROL_ownedcomno = 8000002  # 或 WHERE m.PB_CMB_comno = 8000002  都一樣。
-- 只要條件加對了,就行!!!(條件的位置調整+SQL基礎語法)【where提取到最後(不放在查詢角色後面),group by 必須要放到where後面。】
-- 【再關聯 角色許可權表後,統計的使用者個數,也變化了!》》》使用distinct 約束後恢復原樣。
-- 》》》###要寫出來這個約束,###必須很清楚自己現在查出來的使用者個數的資料是如何出來的:
-- 統計使用者個數有幾個,相當於後面可以擴展出多少條使用者記錄。所以因為之前統計的使用者個數比較少,可以猜到:使用者記錄一定是重複了!】
GROUP BY a.PB_ROL_code






#2
SELECT a.PB_ROL_code,a.PB_ROL_name 
--  , b.PB_UCT_nickname,COUNT(b.PB_UCT_no)   
 , c.PB_PER_code,COUNT(c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno AND  a.PB_ROL_ownedcomno = 8000002
--  LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno GROUP BY a.PB_ROL_code

LEFT JOIN pb_perole c ON c.PB_ROL_code = a.PB_ROL_code GROUP BY c.PB_ROL_code

#3 【簡單的多個join放到一起,不行。】
SELECT a.PB_ROL_code,a.PB_ROL_name 
 , b.PB_UCT_nickname,COUNT(b.PB_UCT_no)   
 , c.PB_PER_code,COUNT(c.PB_PER_code)
from pb_combaseinfo m  
INNER  JOIN pb_role a ON m.PB_CMB_comno = a.PB_ROL_ownedcomno AND  a.PB_ROL_ownedcomno = 8000002
 LEFT JOIN pb_usract b ON b.PB_UCT_roleno = a.PB_ROL_code AND b.PB_UCT_ownedcom = a.PB_ROL_ownedcomno GROUP BY a.PB_ROL_code

-- LEFT JOIN pb_perole c ON c.PB_ROL_code = a.PB_ROL_code GROUP BY c.PB_ROL_code
 LEFT JOIN pb_perole c ON c.PB_ROL_code = b.PB_ROL_code 



#answer  領導
  SELECT
   c.PB_ROL_code as roleID
   ,c.PB_ROL_name as roleName
   ,c.PB_ROL_desc as roleDesc
   ,count(DISTINCT a.PB_UCT_no) AS peoCount
 	,count(DISTINCT d.PB_PER_code) as perCount

FROM
  pb_combaseinfo b
 LEFT JOIN pb_role c ON c.PB_ROL_ownedcomno = b.PB_CMB_comno
 LEFT JOIN pb_usract a ON a.PB_UCT_roleno = c.PB_ROL_code AND a.PB_UCT_ownedcom = b.PB_CMB_comno
 LEFT JOIN pb_perole d ON d.PB_ROL_code = c.PB_ROL_code AND a.PB_UCT_roleno = d.PB_ROL_code
 WHERE b.PB_CMB_comno = 8000002 #{enterpriseId,jdbcType=VARCHAR}
GROUP BY
  c.PB_ROL_name







===》語雀介面文件。

檢視企業角色

請求方式

GET

呼叫的url

modules/intersert/action/getRolesForEnterprise.htm

傳參

無。(已登入使用者才能呼叫此介面,登入使用者從Redis取查詢條件:企業編號:Redis key:"ENTERUUID")

邏輯

  1. 判斷Redis裡“是否是管理員”key的值,判斷登入使用者是不是管理員。是管理員才繼續查詢。不是返回錯誤提示“不是管理員”。

  2. 從Redis取查詢條件:企業編號:Redis key:"ENTERUUID"。(因為Redis的key是token,首先要獲取token。app登入請求有引數token,web登入需要從session裡取token。邏輯封裝到了BaseAction的getToken方法。)

  3. 根據企業編號查詢:當前登入使用者所在的企業下所有的角色列表。

  4. 同時查詢出每個角色擁有的許可權個數、每個角色對應的當前企業的使用者個數。

返回值

已經存在資料

,返回json:

[ {

"roleID" : 0,

"roleName" : "管理員",

"roleDesc" : null,

"peoCount" : 10001,

"perCount" : 1

}, {

"roleID" : 0,

"roleName" : "經辦員",

"roleDesc" : null,

"peoCount" : 10001,

"perCount" : 1

} ]

其他錯誤

{

"msg": "PB0000-系統發生錯誤",

"code": 400

}