簡體   English   中英

在續集上使用 COUNT 聚合 function 添加不需要的 id 字段

[英]Using COUNT aggregate function on sequelize adding unwanted id field

我正在嘗試使用 sequelize 6.21.6對相關模型進行 COUNT 獲取每個類別下的工作總數。

我的 model 看起來像:

models.Sector.hasMany(models.Category, {
   foreignKey: 'sectorId',
   as: 'Categories',
});

models.Category.hasMany(models.Job, {
   foreignKey: 'categoryId',
   as: 'Jobs',
});

我正在使用 COUNT 運行此查詢:

const getSectorsCategories = async () => {
  const sectors = await Sector.findAll({
    attributes: [
      'name'
    ],
    include: [
      {
        model: Category,
        as: 'Categories',
        attributes: ['name', 'sectorId',
          [sequelize.fn('COUNT', sequelize.col('Categories.Jobs.id')), 'jobCount']
        ],
        include: [
          {
            model: Job,
            as: 'Jobs',
            attributes: ['title', 'categoryId'],
          },
        ],
      },
    ],
    group: ['Sector.id', 'Categories.id'],
  },);
  return sectors;
};

使用以下 SQL:

Executing (default): 
SELECT 
  "Sector"."id", 
  "Sector"."name", 
  "Categories"."id" AS "Categories.id", 
  "Categories"."name" AS "Categories.name", 
  "Categories"."sectorId" AS "Categories.sectorId", 
  COUNT("Categories->Jobs"."id") AS "Categories.jobCount", 
  "Categories->Jobs"."id" AS "Categories.Jobs.id", 
  "Categories->Jobs"."title" AS "Categories.Jobs.title", 
  "Categories->Jobs"."categoryId" AS "Categories.Jobs.categoryId" 
FROM 
  "Sectors" AS "Sector" 
  LEFT OUTER JOIN "Categories" AS "Categories" ON "Sector"."id" = "Categories"."sectorId" 
  LEFT OUTER JOIN "Jobs" AS "Categories->Jobs" ON "Categories"."id" = "Categories->Jobs"."categoryId" 
GROUP BY 
  "Sector"."id", 
  "Categories"."id", 
  "Categories->Jobs"."id";

您注意到此字段是由 sequelize 自動添加的: "Categories->Jobs"."id" AS "Categories.Jobs.id"

現在產生此錯誤:

"error": "column \"Categories->Jobs.id\" must appear in the GROUP BY clause or be used in an aggregate function"

似乎消除此錯誤的唯一方法是將空屬性數組傳遞給 Jobs:

include: [
   {
     model: Job,
     as: 'Jobs',
     attributes: [],
   },
]

現在聚合 function COUNT可以按預期工作,但我沒有任何我想要的工作屬性列表。

這種全有或全無的方法有什么解決方法嗎?

您可以嘗試使用 window function。

const sectors = await Sector.findAll({
  attributes: [
    'name'
  ],
  include: [
    {
      model: Category,
      as: 'Categories',
      attributes: ['name', 'sectorId',
        [sequelize.literal('COUNT("Categories->Jobs"."id") OVER (PARTITION BY "Sector"."id", "Categories"."id")'), 'jobCount']
      ],
      include: [
        {
          model: Job,
          as: 'Jobs',
          attributes: ['title', 'categoryId'],
        },
      ],
    },
  ],
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM