部門表 depart
KeyId varchar(50)
DepartName varchar(200)
ParentId varchar(50)
資料:
AA001 總經辦 root
AB001 事業部 root
AA002 行政部 AA001
AB002 客服部 AB001
AB003 研發部 AB001
AB004 支持部 AB002
人員表 people
KeyId int
DepartID varchar(50) 所屬部門
資料:
1 AA001
2 AB001
3 AA002
4 AB002
5 AB003
6 AB004
7 AB004
求統計各部門的人數,結果如下:
AA001 總經辦 2
AA002 行政部 1
AB001 事業部 6
AB002 客服部 2
AB003 研發部 1
AB004 支持部 2
uj5u.com熱心網友回復:
mysql 資料庫,不要存盤程序uj5u.com熱心網友回復:
有一個父級ID parentId 子部門的人數也要算在父級部門上面uj5u.com熱心網友回復:
這種情況要寫個函式,才能實作了。
給你一個例子做參考:
use world;
create table if not exists tb(id int,name varchar(50),pid int,sort int,parent varchar(100),child varchar(100));
insert into tb
values
(1,'水果',0, null,null,null),
(2,'熱帶水果',1,null,null,null),
(3,'菠蘿',2,null,null,null),
(4,'香蕉',2,null,null,null),
(5,'南美菠蘿',3,null,null,null);
drop function if exists getchildlist;
/*
1.
本來是想要用while found_rows()>0 來判斷的,
因為select group_concat(id) into strChildT from tb where find_in_set(pid,strChildT)
如果group_concat(id) 為null時,也會回傳1,所以修改為 while strChildT is not null.
*/
CREATE DEFINER=`root`@`%` FUNCTION `getChildList`(idd int) RETURNS varchar(1000) CHARSET utf8
READS SQL DATA
begin
declare strT varchar(1000);
declare strChildT varchar(1000);
set strT = '$'; /*初始化*/
set strChildT = cast(idd as char); /*凡事需要查找子節點的 父節點都會放到這里*/
while strChildT is not null do
set strT = concat(strT , ',' , strChildT); /*第一次的時候就是: $,idd */
select group_concat(id) into strChildT from tb where find_in_set(pid,strChildT);
end while;
return strT; /*回傳: idd所有子節點的逗號間隔的字串,包含idd節點本身*/
end
--2.顯示當前id的所有子節點串列
mysql> select *,getChildList(id) from tb;
+------+----------+------+------+--------+-------+------------------+
| id | name | pid | sort | parent | child | getChildList(id) |
+------+----------+------+------+--------+-------+------------------+
| 1 | 水果 | 0 | NULL | NULL | NULL | $,1,2,3,4,5 |
| 2 | 熱帶水果 | 1 | NULL | NULL | NULL | $,2,3,4,5 |
| 3 | 菠蘿 | 2 | NULL | NULL | NULL | $,3,5 |
| 4 | 香蕉 | 2 | NULL | NULL | NULL | $,4 |
| 5 | 南美菠蘿 | 3 | NULL | NULL | NULL | $,5 |
+------+----------+------+------+--------+-------+------------------+
5 rows in set (0.03 sec)
--3.查詢節點1下面的所有子節點
mysql> select * from tb where find_in_set(id,getChildList(1));
+------+----------+------+------+--------+-------+
| id | name | pid | sort | parent | child |
+------+----------+------+------+--------+-------+
| 1 | 水果 | 0 | NULL | NULL | NULL |
| 2 | 熱帶水果 | 1 | NULL | NULL | NULL |
| 3 | 菠蘿 | 2 | NULL | NULL | NULL |
| 4 | 香蕉 | 2 | NULL | NULL | NULL |
| 5 | 南美菠蘿 | 3 | NULL | NULL | NULL |
+------+----------+------+------+--------+-------+
5 rows in set (0.16 sec)
uj5u.com熱心網友回復:
MYSQL中僅用SQL陳述句無法實作,只能通過存盤程序/函式,或者在外部程式中實作。http://blog.csdn.net/acmain_chm/article/details/4142971
MySQL中進行樹狀所有子節點的查詢
在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY 我們可以方便的查了所有當前節點下的所有子節點。但很遺憾,在MySQL的目前版本中還沒有對應的功能。 在MySQL中如果是有限的層次,比如我們事先如果可以確定這個樹的最大深度是4, 那么所有節點為根的樹的深度均不會超過4,則我們可以直接通過left join 來實作。 但很多時候我們...
uj5u.com熱心網友回復:
樓上正解,單純sql搞不定,只能用程序了uj5u.com熱心網友回復:
一級部門不要 單純二級部門能搞定吧
uj5u.com熱心網友回復:
一級部門不要 單純二級部門能搞定吧uj5u.com熱心網友回復:
我們前兩天也用到樹形結構,因為要頻繁訪問,最后是在程式初始化的時候,把樹形結構以多叉樹的形式加載到記憶體里,每次在記憶體訪問。uj5u.com熱心網友回復:
WITH RECURSIVE T AS (SELECT ds."keyId", ds."depName", ds."parentId",ds."keyId"||'' AS ID,ds."count"
FROM (SELECT d."keyId",d."depName",d."parentId",count(*) count,1 AS level FROM depart d,people p WHERE d."keyId"=p."departId"
GROUP BY d."keyId",d."depName",d."parentId") ds
WHERE "parentId"='root'
UNION
SELECT d."keyId",d."depName", d."parentId",(ts.ID||','||d."keyId"),d."count"
FROM (SELECT d."keyId",d."depName",d."parentId",count(*) count FROM depart d,people p WHERE d."keyId"=p."departId"
GROUP BY d."keyId",d."depName",d."parentId")d
JOIN T ts ON d."parentId" = ts."keyId"
)
SELECT d."keyId",d."depName",sum(t.count) FROM T t ,depart d WHERE t.id like '%'||d."keyId"||'%' GROUP BY d."keyId",d."depName" ORDER BY d."keyId" ASC
uj5u.com熱心網友回復:
可以一條陳述句搞定的:select aa.keyid,aa.DepartName,ifnull(bb.cnt,0) cnt
from depart aa
left join (select departid,count(1) cnt from people group by departid) bb on aa.keyid=bb.departid
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/90935.html
標籤:MySQL
上一篇:如何對下表進行分組?
