Sequelize如何按照同一字段分组查询数据?

问题描述

一个简单的场景:

fruit表(A喜欢吃苹果和香蕉,B喜欢苹果,C喜欢苹果、香蕉、橘子、猕猴桃,D喜欢猕猴桃)

namefruits
A1,2
B1
C1,2,3,4
D4

现在想查出来喜欢苹果的有多少人,喜欢香蕉的有多少人,喜欢橘子的有多少人,喜欢猕猴桃有多少人,并且把这个数据拼装成一个数组形式返回。

问题出现的环境背景及自己尝试过哪些方法

目前用SQL查已经可以查出来了:

select sum(find_in_set('1', fruits) > 0) as ‘苹果’,
    sum(find_in_set('2', fruits) > 0) as ‘香蕉’,
    sum(find_in_set('3', fruits) > 0) as ‘橘子’,
    sum(find_in_set(‘4’, fruits) > 0) as ‘猕猴桃’ from `fruit`

但是项目里用的是Sequelize ORM语法,初接触不太会,麻烦各位大神帮忙看看,Sequelize要怎么写呀?

相关代码

我现在用Sequelize只会写单个查询,所以想出了一个办法,就是通过for循环,效果已经实现了,但是这么写感觉很不规范

const fruits = [
    {
      label: ‘苹果‘,
      value: 1,
      number: 0, // 有几个人喜欢苹果
    },
    {
      label: ‘香蕉’,
      value: 2,
      number: 0,
    },
    {
      label: ‘橘子‘,
      value: 3,
      number: 0,
    },
    {
      label: ‘猕猴桃‘,
      value: 4,
      number: 0,
    }
]

for (let i = 0; i <fruits.length; i++) {
    const item =
      (await fruitsService.findAllWithOptions({
        where: sequelize.where(
          sequelize.fn(
            'FIND_IN_SET',
            fruits[i].value,
            sequelize.col('fruits'),
          ),
          '>',
          '0',
        ),
      })) || [];
    fruits[i].number = item.count;
  }
  return fruits;

你期待的结果是什么?实际看到的错误信息又是什么?

我期待能实现查询出每个水果喜欢的人数,并返回数组形式,因为实际场景是要做统计图表。

阅读 2.9k
1 个回答

第一种写法:直接使用 query 查询原生 sql

let result  = await  sequelize.query('sql')
console.log(result)

sql 就是你的写的那些sql

第二种写法:ORM

let appleFn = [sequelize.fn('SUM' , sequelize.literal(`find_in_set('1', fruits) > 0`) ) , '苹果'];
let bananaFn = [sequelize.fn('SUM' , sequelize.literal(`find_in_set('2', fruits) > 0`) ) , '香蕉'];
let orangeFn = [sequelize.fn('SUM' , sequelize.literal(`find_in_set('3', fruits) > 0`) ) , '橘子'];
let kiwifruitFn = [sequelize.fn('SUM' , sequelize.literal(`find_in_set('4', fruits) > 0`) ) , '猕猴桃'];

let attr = [appleFn , bananaFn , orangeFn , kiwifruitFn];
let result  = await Fruit.findAll({
    attributes : attr
});

//'Fruit' 对应的是你的 fruit 表 ,换成你代码里面的引用就好了

console.log(result)

试试看下能不能拿到你想要的结果

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题