DB/MySQL

[MySQL 8.0] WITH RECURSIVE ์จ์„œ ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ

๋ฐฐ๊ณ ํŒŒ์š” 2024. 5. 17. 15:47
728x90


๐Ÿ“ ์˜ค๋ผํด์—์„œ๋Š” start with ~ connect by  ๋กœ ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ... ใ… ใ…  mysql ์€ ์•ˆ๋จ.

 

 

 

 

๐Ÿ“ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ!

CREATE TABLE `menu` (
  `menu_id` int NOT NULL,
  `menu_name` varchar(45) DEFAULT NULL,
  `role` varchar(45) DEFAULT NULL,
  `status` varchar(1) DEFAULT NULL,
  `par_menu_id` varchar(45) DEFAULT NULL,
  `menu_path` varchar(45) DEFAULT NULL,
  `order_num` int DEFAULT NULL,
  `reg_date` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`menu_id`)
)

INSERT INTO `menu` VALUES 
(1,'๊ด€๋ฆฌ์ž','admin','1',NULL,NULL,1,'2024-04-23 11:38:22')
,(2,'์‚ฌ์šฉ์ž','user','1',NULL,NULL,2,'2024-04-23 12:41:12')
,(3,'์˜ํ™”','user','1','2','/movie/list',1,'2024-04-23 12:28:54')
,(4,'์˜ˆ๋งค','user','1','2','/booking/list',2,'2024-04-23 12:41:12')
,(5,'๊ทน์žฅ','user','1','2','/theater/list',3,'2024-04-23 12:41:12')
,(6,'์ „์ฒด์˜ํ™”','user','1','3','/movie/list',2,'2024-04-27 05:06:24')
,(7,'์˜ˆ์ •','user','1','2',NULL,1,'2024-04-29 02:53:17')
,(8,'์ผ๊ฐ„','user','1','7',NULL,1,'2024-04-29 03:00:53')
,(9,'์ฃผ๊ฐ„','user','1','7',NULL,2,'2024-04-29 03:26:15');

 

WITH RECURSIVE cte AS (
	SELECT menu_id, menu_name, role, status, par_menu_id, menu_path, order_num,
		   CAST(CONCAT(order_num, '_', menu_id) as CHAR(40)) AS v_ord,
		   1 AS lvl
	FROM menu 
	WHERE par_menu_id IS NULL AND status = '1' 
	AND role = 'user'
	UNION ALL
	SELECT t.menu_id, t.menu_name, t.role, t.status, t.par_menu_id, t.menu_path, t.order_num,
		   CONCAT(cte.v_ord, '->', t.order_num, '_', t.menu_id) AS v_ord,
		   cte.lvl + 1
	FROM menu t
	INNER JOIN cte ON t.par_menu_id = cte.menu_id
	where t.status = '1'
)
SELECT * FROM cte
WHERE par_menu_id IS NOT NULL 
ORDER BY v_ord

 

 

๐Ÿ“ ๊ฒฐ๊ณผ ?

 


 

+) ๐Ÿ“์‘์šฉ!

  • ์‘์šฉ 1. status ์ปฌ๋Ÿผ์„ ์ด์šฉํ•ด์„œ, "์‚ฌ์šฉ", "๋ฏธ์‚ฌ์šฉ"์„ ๊ตฌ๋ฌธํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Œ.
    • ์ตœ์ƒ๋‹จ ๋ถ€๋ชจ๊ฐ€ "๋ฏธ์‚ฌ์šฉ" ์ด๋ผ๋ฉด ๊ทธ ์ดํ•˜์˜ ์ž์‹๋“ค์€ ๋ชจ๋‘ ๋ฏธ์‚ฌ์šฉ์œผ๋กœ ๊ฐ„์ฃผ.
    • 1: ์‚ฌ์šฉ, 9: ๋ฏธ์‚ฌ์šฉ

status ๊ฐ’์„ 9๋กœ ๋ณ€๊ฒฝ - 1:์‚ฌ์šฉ, 9:๋ฏธ์‚ฌ์šฉ

--> ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ 


 

  • ์‘์šฉ 2. order_num ์ปฌ๋Ÿผ์„ ์ด์šฉํ•ด์„œ, ํ•˜์œ„ ๋ฉ”๋‰ด์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ  ์‹ถ์Œ.
    • ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์›ํ•  ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์Œ.
    • ๋‚˜์ค‘์— ๋งŒ๋“  ๋ฉ”๋‰ด๊ฐ€ ๋” ์•ž์— ๋ณด์ด๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ!
      • CONCAT(cte.v_ord, '->', t.order_num, '_', t.menu_id) AS v_ord
      • 1. ์žฌ๊ท€๋กœ ๋Œ์•„์˜จ ์ •๋ ฌ์ˆœ์„œ -> 2.์„ค์ •ํ•œ ์ •๋ ฌ ์ˆœ์„œ _ ๋ฉ”๋‰ดid
        • ์ •๋ ฌ์ˆœ์„œ _ ๋ฉ”๋‰ดid ๋กœ ํ•˜๋Š” ์ด์œ ๋Š”,,
          ์‚ฌ๋žŒ์ด ์„ค์ •ํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐ™์€ ์ •๋ ฌ์ˆœ์„œ๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ..

--> ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ

 


์ถœ์ฒ˜ : 

- mysql ํ•˜์ด์–ด๋ผํ‚ค hierarchy Tree ๊ตฌ์กฐ

https://dalili.tistory.com/228

http://www.kkujunhee.net/bbs/board.php?bo_table=db&wr_id=64

https://12teamtoday.tistory.com/25

 


๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์œ„ํ•œ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. 

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”! 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

728x90