我从MySQL数据库选择数据时遇到问题

时间:2019-12-18 04:01:16

标签: 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

有可能吗?

2 个答案:

答案 0 :(得分:1)

您可以通过检查USERID是否与.的模式匹配,然后跟一些数字,再跟一个.作为整个字符串来进行此操作(使用正则表达式{{1} }),如果是,则返回'^\\.[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

Demo on dbfiddle

要获取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 中的NAME,我们将PARENT的结果返回到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

Demo on dbfiddle

答案 1 :(得分:1)

您可以使用substring_index修剪最近2个周期之间的字符

所以您的查询将如下所示

parseJSON

工作小提琴 http://sqlfiddle.com/#!9/36435a/13