现有用户表app_user,字段有id,name,phone,nickname,password,invite_code,create_time,update_time,用户上级关系表 app_user_group,字段id,pid(父级id),level(层级),sid(子id),create_time,要求把每个用户的上所有级查询出来并插入 app_user_group表中并标明level层级
时间: 2023-06-17 15:07:08 浏览: 106
查询表字段信息
5星 · 资源好评率100%
可以使用递归查询的方式来实现这个需求。
首先,我们需要定义一个存储用户层级关系的表 app_user_group,以及一个存储用户信息的表 app_user。
然后,我们可以通过递归查询的方式来将每个用户的所有上级都查询出来,并插入到 app_user_group 表中。
具体实现可以按照以下步骤:
1. 创建 app_user_group 表
```sql
CREATE TABLE app_user_group (
id INT AUTO_INCREMENT PRIMARY KEY,
pid INT NOT NULL,
level INT NOT NULL,
sid INT NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
2. 创建 app_user 表
```sql
CREATE TABLE app_user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
phone VARCHAR(11) NOT NULL,
nickname VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
invite_code VARCHAR(20) NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
3. 编写递归查询的 SQL 语句
```sql
INSERT INTO app_user_group (pid, level, sid)
SELECT
parent.id as pid,
child.level + 1 as level,
child.sid as sid
FROM
app_user_group AS child
JOIN app_user AS child_user ON child.sid = child_user.id
JOIN app_user AS parent_user ON child_user.invite_code = parent_user.phone
JOIN app_user_group AS parent ON parent.sid = parent_user.id
WHERE
child.level > 0
AND NOT EXISTS (
SELECT *
FROM app_user_group
WHERE pid = parent.id
AND sid = child.sid
)
```
上面的 SQL 语句中,我们通过递归查询的方式,将每个用户的所有上级都查询出来,并插入到 app_user_group 表中。其中,我们使用了别名来区分每个表的不同实例,方便后续的查询。
4. 执行 SQL 语句
```sql
INSERT INTO app_user_group (pid, level, sid)
SELECT
child_user.id as pid,
0 as level,
child_user.id as sid
FROM
app_user AS child_user
WHERE
NOT EXISTS (
SELECT *
FROM app_user_group
WHERE pid = child_user.id
AND sid = child_user.id
);
INSERT INTO app_user_group (pid, level, sid)
SELECT
parent.id as pid,
child.level + 1 as level,
child.sid as sid
FROM
app_user_group AS child
JOIN app_user AS child_user ON child.sid = child_user.id
JOIN app_user AS parent_user ON child_user.invite_code = parent_user.phone
JOIN app_user_group AS parent ON parent.sid = parent_user.id
WHERE
child.level > 0
AND NOT EXISTS (
SELECT *
FROM app_user_group
WHERE pid = parent.id
AND sid = child.sid
);
```
上面的代码中,我们首先将所有的子节点插入到 app_user_group 表中(level 为 0),然后再通过递归查询的方式,将每个用户的所有上级都查询出来并插入到 app_user_group 表中(level 依次递增)。
需要注意的是,上面的代码中我们使用了两个 SQL 语句来完成操作,第一个 SQL 语句是用来插入所有子节点的,第二个 SQL 语句是用来插入所有上级节点的。这是因为在 MySQL 中,如果我们在同一个 SQL 语句中同时插入子节点和上级节点,可能会导致死循环的情况发生。
5. 检查结果
执行完上面的代码之后,我们可以通过查询 app_user_group 表来检查结果是否正确。例如,我们可以查询 id 为 1 的用户的所有上级节点,可以使用以下 SQL 语句来查询:
```sql
SELECT
parent_user.name,
parent_user.phone,
parent_user.nickname,
parent_user.invite_code,
group.level
FROM
app_user_group AS group
JOIN app_user AS child_user ON group.sid = child_user.id
JOIN app_user AS parent_user ON group.pid = parent_user.id
WHERE
child_user.id = 1
ORDER BY group.level DESC;
```
执行上面的 SQL 语句之后,应该可以看到 id 为 1 的用户的所有上级节点信息。
阅读全文