node后端分页—多表查询的情况

一、思路

分情况
如果是单表查询直接通过sql语句的limit关键字限制返回条数,将结果返回给前端就是了,
如果是多表查询就是查询中再嵌套查询,然后将数据处理后返回给前端
这里讨论多表查询的情况

二、连接数据库

const mysql = require("mysql");
// https://www.npmjs.com/package/mysql
module.exports = {
    config: {
        host: '127.0.0.1', // 数据库所在电脑的IP或者服务器的域名
        port: 3306,
        user: 'root',
        password: '密码',
        database: 'familydoctor',
        multipleStatements: true, // 支持执行多条 sql 语句
        timezone: '08:00' // 设置时区,如果不匹配,就可能有时差
    },
    connect(sql, params, cb) {
        let conn = mysql.createConnection(this.config)
        conn.connect(); // 打开链接
        conn.query(sql, params, cb); //执行mysql语句
        conn.end() //关闭链接
    }
}

数据库
用户表
在这里插入图片描述
权限表
在这里插入图片描述
用户权限表
在这里插入图片描述
希望返回给前端的数据
在这里插入图片描述

三、接口

查询里面再嵌套查询,将数据处理后再返回给后端
// 5.管理用户列表-后端分页
userRouter.route('/getUserInfoPage')
    .get(function(req, res) {
        //解构
        let { nowPage, pageCount } = req.query
        // 总条数
        let totalCount = 0
        let sql = `SELECT  * FROM  systemusers`
        let callback = (err, data) => {
        //查询成功
            if (err === null) {
                console.log('++++++++', data);
                //总条数
                totalCount = data.length

				//由于是多表查询,这里的分页我们采用前端分页的方式,详情见博客前端分页
                let start = (nowPage - 1) * pageCount
                let end = start + pageCount
                let userArr = data.filter((item, index, arr) => {
                    return index >= 2 && index < 4
                })
                console.log(userArr);
                // 没有查询到数据
                if (userArr.length === 0) {
                    res.json({
                        code: 50001,
                        msg: '没有查询到数据'
                    })
                    return
                }

				//查询成功进行二层查询
                let sql = ''
                let params = []
                // 根据userArr的长度拼接sql
                for (let i = 0; i < userArr.length; i++) {
                    sql += `
                    SELECT a.acid,acname FROM systemusers AS s ,useraccess AS u,accesscontrol AS a
                    WHERE s.uid=u.uid AND u.acid=a.acid and s.uid=?;
                    `
                    params.push(userArr[i].uid)
                }
                let callback2 = (err, data) => {
                    console.log(data);
                    //查询成功
                    if (err === null) {
                    //数据的处理
                        if (data.length === 1) {
                            userArr[0].accessList = data
                        } else {
                            for (let i = 0; i < data.length; i++) {
                                userArr[i].accessList = data[i]
                            }
                        }
                        res.json({
                            code: 0,
                            msg: '查询成功',
                            data: userArr,
                            totalCount
                        })
                    }
                }
                //第二层查询
                DB.connect(sql, params, callback2)
            }
        }
        //第一层查询
        DB.connect(sql, [], callback)
    })

四、结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值