小程序云开发多表查询

关联表学习

文中代码并不是实际代码,伪代码不可直接运行。

功能:用户 喜欢 文章

  1. 用户表(users)

    idusername
    唯一标识,没有登录的可直接使用 _openid用户名
  2. 文章表(articles)

    idtitlecontent
    唯一标识标题内容
  3. 关联表(relation)

    indexuserIdarticleId
    唯一索引用户 ID文章 ID

用户喜欢文章时,向 relation 添加一条数据,

用户取消喜欢时,从 relation 删除对应的数据。

需求

  1. 查询文章列表,返回文章标题、喜欢人数、用户是否喜欢

    第一步:先查询出文章列表

    select * from articles
    复制代码

    第二步:遍历文章列表,查询关联表得到用户是否喜欢、喜欢人数

    for (article : articles) {
        isLike = ( select * from relation where articleId = article.id && userId = 'userId' )
        likeCount = ( select count(*) from relation where articleId = article.id )
        article.isLike = isLike
        article.likeCount = likeCount
    }
    复制代码
    const db = cloud.database()
    
    const getArticles = async (event, context) => {
        const { userInfo: { openId } } = event
        return db.collection('articles').get().then(({ data }) => {
            let articles = []
            for (let i = 0, length = data.length; i < length; ++i) {
                await Promise.all([
                    db.collection('relation').where({
                        articleId: data[i].id,
                    }).count(),
                    db.collection('relation').where({
                        articleId: data[i].id,
                        userId: openId,
                    }).count()
                ]).then(([likeCount, liked]) => {
                    articles.push({
                        ...data[i],
                        likeCount,
                        liked: !!liked,
                    })
                })
            }
            return {
                data: articles,
                message: 'success',
            }
        }).catch( err => {
            console.error(err.errMsg)
            return Promise.reject({
                data: [],
                message: err.errMsg,
            })
        })
    }
    复制代码
  2. 查询用户喜欢的文章列表,返回文章标题、喜欢人数

    第一步:查询关联表得到用户喜欢的文章 ID 数组

    select articleId from relation where userId = 'userId'
    复制代码

    第二步:遍历文章 ID 数组,查询文章表得到标题

    res = [] // 最终结果
    for (id : articleIds) {
        details = ( select * from articles where articleId = id )
        likeCount = ( select count(*) from relation where articleId = id )
        res.push({
            articleId: id,
            title: details.title,
            likeCount: likeCount,
        })
    }
    复制代码
    const db = cloud.database()
    const _ = db.command
    
    const getFavArticles = async (event, context) => {
        const { userInfo: { openId } } = event
        return db.collection('relation').where({
            userId: openId,
        }).field({
            articleId: true,
        }).get().then(({ data }) => {
            return db.collection('articles').where({
                id: _in(data.map( item => item.articleId )),
            }).then(({ data: articles }) => {
                let result = []
                for (let i = 0, length = articles.length; i < length; ++i) {
                	await db.collection('relation').where({
                        articleId: articles[i].id,
                    }).count().then(({ total }) => {
                        result.push({
                            ...articles,
                            likeCount: total,
                        })
                    })
            	}
                return {
                    data: result,
                    message: 'success',
                }
            })
        }).catch( err => {
            console.error(err)
            return Promise.reject({
                data: [],
                message: err.errMsg,
            })
        })
    }
    复制代码
  3. 查询文章详情,返回文章标题、内容、喜欢人数、用户是否喜欢

    select title, content, likeCount from articles
    select count(*) from relation where articleId = 'articleId' && userId = 'userId'
    复制代码
    const db = cloud.database()
    
    const getArticleDetails = (event, context) => {
        const { userInfo: { openId }, id } = event
        return Promise.all([
            // 如果直接使用微信自带的 _id 索引可直接使用
            // db.collection('articles').doc(id)
            db.collection('articles').where({ id }),
            db.collection('relation').where({
                userId: openId,
                articleId: id,
            }).count()
        ]).then(([details, total]) => {
            // 注意使用 where 查询后这里的 details 是个数组
            if (details.length) {
                return {
                    data: {
                        ...details[0],
                        liked: !!total,
                    },
                    message: 'success',
                }
            }
        }).catch( err => {
            console.error(err)
            return Promise.reject({
                data: {},
                message: err.errMsg,
            })
        })
    }
    复制代码

小程序地址

https://github.com/Honye/weapp-mark
作者:Honye
链接:https://juejin.im/post/5baadb086fb9a05ce2740968
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库多表联查小程序-说明 这是一个数据库多个表一起查询的小程序,主要缓解系统中报表设计中只读取一个表的问题。和对SQL语句不太会用的朋友查询之用。由于这是小程序,功能没有太多,只能查询,不能修改数据库的表。这个软件还有很多足之处,敬请谅解。“如SQL语句出错但没有提示是什么错误。”“不能保存,已经生成的语句。(但可以手动复制TXT文本出来。)”“不能和报表软件有机结合”等等。 由于时间及所学知识有限问题。暂时只能做到这个样子。下一步将与Grid++Report 报表设计器(可以在http://yunpan.cn/QUXEFX4nSaQXv 这里下载)的软件结合,做到一体化。这样以后就不用担心系统软件的报表功能不能满足行业需求了! 这是一个数据库多个表一起查询的小程序,主要缓解系统中报表设计中只读取一个表的问题。和对SQL语句不太会用的朋友查询之用。由于这是小程序,功能没有太多,只能查询,不能修改数据库的表。 使用方法: 1. 首先点,“1.连接数据库”按键,连接数据库。 2. 3. 出现如下窗口,点击Build按钮 图表 3 4 选择如下图标示项,并点击下一步 图表 3 5 如下图,第一项选择你需要的SQL服务器,第二项如选择使用windows集成安全设置则不需要输入用户名及密码,选择使用指定的用户名和密码是则需要输入已在数据库中建立的用户名和密码,当第二项设置正确时第三项的在服务器上选择数据库的下拉项中会出现你所选择的数据库服务器上的所有可用数据库,选择你所需要的数据库即可。 图表 3 6 设置完成后点击测试连接按钮,出现如下图画面时表示数据库连接成功可以点确定结束设置。 图表 3 7 二,读表。 三、单击数据库表名。由于我们系统的表,有中文视图表,所以有中文。 四、点击表名后,其内容列,就会在右边列表出现。 与此同时,右边的中部的,条件语句,表名部分,也会出现该表。 另外,在这里,也有这个表的表名,按显示,就会显示这内的内容,这样设置是为不让当大数据量的表出现时,会令软件卡死。 五、在没有条件录入的情况下,可以通按“全表查看”生成SQL语句, 再按“执行语句”键,下面的主表就出来了。还可以按表后面的,“导出XLS”键,导出到XLS表。 六,多条件查询。 我们要查询 00061号的病人, 1、 首先,在主表中选择“门诊病人就诊记录”, 再选择列名, 再选择,主表名为“门诊病人记录”的表 再选择项目, 选择好后,我们要选择后置条件。 然后选择条件,再按“后置条件增加”它就会出现 在后面的文本框中, 然后单击文本框中的内容,就会传送到,“条件语句”的框中,这个条件就准备好了。 最后按“选列多条件”键 ,就会生成SQL语句了。 再按“执行语句”按键,报表 就出来了!! 再导出, 时间条件的增加 有由于前置条件要会更多的SQL语句,所以没有办法,所以前置条件为文本,是让会语句的人直接写入语句用的。在这里写入 由于时间及所学知识有限问题。暂时只能做到这个样子,这个软件还有很多足之处,敬请谅解。 新版修正了上一版条件输入的错误。 新版增加了: 1,修改表的功能(但请慎用)。按:“方便快捷找出数据库里存放用户名和密码的表.doc”的方法,就可以很快找到你想要修改的表了。 2、 增加可以导入,导出生成的SQL语句。(方便下次调用,生成表XLS表) 3、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值