Environment :
- MySQL 5.7.x
- Spring MVC
Table Data (name: TableA)
| seq | level | name | order | parent_seq |
|---|---|---|---|---|
| 1 | 1 | name1 | 1 | 0 |
| 2 | 1 | name2 | 2 | 0 |
| 3 | 2 | sub1-1 | 1 | 1 |
| 4 | 2 | sub1-2 | 2 | 1 |
| 5 | 2 | sub2-1 | 1 | 2 |
| 6 | 3 | third-2-1 | 1 | 5 |
| 7 | 3 | third-1-1 | 1 | 3 |
Expected Result
| seq | level | name | order | parent_seq | next_level |
|---|---|---|---|---|---|
| 1 | 1 | name1 | 1 | 0 | 2 |
| 3 | 2 | sub1-1 | 1 | 1 | 3 |
| 7 | 3 | third-1-1 | 1 | 3 | 2 |
| 4 | 2 | sub1-2 | 2 | 1 | 1 |
| 2 | 1 | name2 | 2 | 0 | 2 |
| 5 | 2 | sub2-1 | 1 | 2 | 3 |
| 6 | 3 | third-2-1 | 1 | 5 | 1 (last default value: 1) |
Now I'm genenrating expected result with nested for statement(JAVA). Is there any way to generate expected result only with MySQL Query?
Thanks in advance!
CodePudding user response:
Summary:
Use
REGEXP_SUBSTR(name,"[0-9] \-?[0-9]*")to extract the numbers and sort the datas using the numbers.For MySQL v8 above, you can use
LEAD()to generate the "next_level" column based on the "level" columnCOALESCE()function for the last default value = 1
SELECT
t1.*,
COALESCE(LEAD(t1.level, 1) OVER(ORDER BY REGEXP_SUBSTR(name,"[0-9] \-?[0-9]*")), 1) AS next_level
FROM TableA t1
ORDER BY REGEXP_SUBSTR(name,"[0-9] \-?[0-9]*"), t1.level
See db<>fiddle
