首页 > 解决方案 > 我在从 MySQL 数据库中选择数据时遇到问题

问题描述

我在从 mysql 数据库中选择数据时遇到问题。我不知道如何解释我的问题,所以这是我user表中的数据......

从用户中选择 *

USERID      NAME
.1.         A
.1.1.       B
.1.2.       C
.1.2.1.     D
.2.         E
.2.1.       F
.2.1.1.     G
.2.1.1.1.   H
.3.         I
.3.1.       J

我希望的结果

PARENT  USERID      NAME
-       .1.         A
.1.     .1.1.       B
.1.     .1.2.       C
.1.2.   .1.2.1.     D
-       .2.         E
.2.     .2.1.       F
.2.1.   .2.1.1.     G
.2.1.1. .2.1.1.1.   H
-       .3.         I
.3.     .3.1.       J

那可能吗?

标签: mysql

解决方案


您可以通过检查a后跟一些数字后跟 a作为整个字符串(使用正则表达式)USERID的模式是否匹配,如果是,则返回 a ; 如果不是,则生成最多(并包括倒数第二个)的子字符串:..'^\\.[0-9]+\\.$'-USERID.

SELECT
    CASE WHEN USERID REGEXP '^\\.[0-9]+\\.$' THEN '-'
         ELSE SUBSTRING(USERID, 1, LENGTH(USERID) - LOCATE('.', SUBSTRING(REVERSE(USERID), 2)))
    END AS PARENT,
    USERID,
    NAME
FROM user

输出:

PARENT      USERID      NAME
-           .1.         A
.1.         .1.1.       B
.1.         .1.2.       C
.1.2.       .1.2.1.     D
-           .2.         E
.2.         .2.1.       F
.2.1.       .2.1.1.     G
.2.1.1.     .2.1.1.1.   H
-           .3.         I
.3.         .3.1.       J

dbfiddle 上的演示

为了也得到 的NAMEPARENT我们LEFT JOIN将上面的结果返回到user表上的PARENT值:

SELECT u.*, COALESCE(p.NAME, '-') AS PARENTNAME
FROM (
    SELECT
        CASE WHEN USERID REGEXP '^\\.[0-9]+\\.$' THEN '-'
             ELSE SUBSTRING(USERID, 1, LENGTH(USERID) - LOCATE('.', SUBSTRING(REVERSE(USERID), 2)))
        END AS PARENT,
        USERID,
        NAME
    FROM user
    ) u
LEFT JOIN user p ON p.USERID = u.PARENT
ORDER BY USERID

输出

PARENT      USERID      NAME    PARENTNAME
-           .1.         A       -
.1.         .1.1.       B       A
.1.         .1.2.       C       A
.1.2.       .1.2.1.     D       C
-           .2.         E       -
.2.         .2.1.       F       E
.2.1.       .2.1.1.     G       F
.2.1.1.     .2.1.1.1.   H       G
-           .3.         I       -
.3.         .3.1.       J       I

dbfiddle 上的演示


推荐阅读