Sequelize左连接统计关联表行数报错,求添加DISTINCT方法
问题解决:Sequelize左连接统计报错及添加DISTINCT方法
一、左连接统计报错原因及修复
报错Unknown column 'contact_label.label_id' in 'field list'的核心原因是:生成的SQL中,COUNT语句错误引用了原表名contact_label的字段,但JOIN操作已经给该表起了别名contact_labels,数据库无法识别未别名的原表名字段。
修复后的左连接查询代码
修改attributes.include中的COUNT字段引用,使用关联别名contact_labels的字段(推荐用主键id,避免外键为NULL的统计误差):
let result = await this._label.findAll({ where: { user_id: user_id, name: { [Op.like]: '%' + keyword + '%' } }, attributes: { include: [ [ Sequelize.fn("COUNT", Sequelize.col("contact_labels.id")), "contactLabelCount" ], ] }, include: [ { as: 'contact_labels', model: ContactLabel, required: false, attributes: [] } ], group: [ 'labels.id', 'labels.user_id', 'labels.name', 'labels.description', 'labels.color', 'labels.created_at', 'labels.updated_at', ], limit: 10, })
修复后生成的SQL会正确使用别名contact_labels,即可正常统计。
二、添加DISTINCT的两种实现方式
如果需要统计去重后的联系人数量(即同一个联系人被关联多次时只算一次),可通过以下两种方式实现:
方式1:左连接+COUNT(DISTINCT)
直接在COUNT函数中嵌套DISTINCT,指定去重的字段(这里用contact_id):
attributes: { include: [ [ Sequelize.fn("COUNT", Sequelize.fn("DISTINCT", Sequelize.col("contact_labels.contact_id"))), "contactLabelCount" ], ] }
方式2:sequelize.literal子查询+DISTINCT
修改你之前的子查询写法,在COUNT后添加DISTINCT:
attributes: { include: [ [ sequelize.literal(`( SELECT COUNT(DISTINCT cl.contact_id) FROM contact_label AS cl WHERE cl.label_id = labels.id )`), 'contactLabelCount' ], ] }
内容的提问来源于stack exchange,提问作者yeln
相关产品推荐
相关产品推荐

