社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Vanestica Ireline • 5 年前 • 1586 次点击  

从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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51473
 
1586 次点击  
文章 [ 3 ]  |  最新文章 5 年前
PHP Geek
Reply   •   1 楼
PHP Geek    5 年前
If you have parent table , you can get data using "JOIN" by parent_id
please share some tables detailfor more refrence
sumit
Reply   •   2 楼
sumit    5 年前

可以使用子字符串索引修剪最后两个句点之间的字符

所以你的问题如下

select 
case when parent ='' then '-' else concat(parent,'.') end  as parent ,
userid,
name
from
(
select 
TRIM(TRAILING concat('.',substring_index(TRIM(TRAILING '.' from USERID), '.', -1),'.')  from USERID) as parent, 
NAME as name,
USERID from user
)tmp

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

Nick
Reply   •   3 楼
Nick    5 年前

你可以通过检查 USERID 符合 . 后面跟一些数字,后面跟一个 . 作为整个字符串(使用regex '^\\.[0-9]+\\.$' )如果是,返回 - ;如果不是,则生成 用户ID 直至(包括倒数第二个 . ):

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

Demo on dbfiddle

同时获得 NAME PARENT ,我们 LEFT JOIN 以上结果返回到 user 上的桌子 起源 价值:

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

Demo on dbfiddle