javascript - Sequelize,请求带有评级和标签的产品时出现问题

标签 javascript node.js sequelize.js

选择带有标签的产品及其评级的请求的问题。我2个月都无法解决问题,我真的需要帮助。

关系:

const models = require("./models");

const initRelations = () => {
  models.Product.belongsToMany(models.Tag, { through: "ProductTag" });

  models.Tag.belongsToMany(models.Product, { through: "ProductTag" });

  models.User.belongsToMany(models.Role, { through: "UserRoles" });

  models.Role.belongsToMany(models.User, { through: "UserRoles" });

  models.User.hasMany(models.Rating);

  models.Product.hasMany(models.Rating);

  models.Rating.belongsTo(models.Product);

  models.Rating.belongsTo(models.User);
};
module.exports = { initRelations };

要求:
const products = await models.Product.findAll({
        subQuery: false,

        offset,

        limit: Number(amount),

        where: whereOptions,

        order: orderOptions,

        attributes: [
          "id",
          "price",
          "title",
          "amount",
          "description",
          "picture",
          "createdAt",
          "updatedAt",

          [
            sequelize.fn("avg", sequelize.col("ratings.ratingValue")),
            "averageRating"
          ],

          [
            sequelize.fn("count", sequelize.col("ratings.ratingValue")),
            "amountOfRatings"
          ]
        ],

        include: [
          {
            model: models.Rating,
            required: false,
            attributes: ["ratingValue", "productId"]
          },
          {
            model: models.Tag,
            attributes: []
          }
        ],

        group: ["products.id"]
      });

错误:
DatabaseError [SequelizeDatabaseError]: Expression #11 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'omVapeShop.ratings.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mainserver       |     at Query.formatError (/app/mainserver/node_modules/sequelize/lib/dialects/mysql/query.js:244:16)
mainserver       |     at Query.handler [as onResult] (/app/mainserver/node_modules/sequelize/lib/dialects/mysql/query.js:51:23)
mainserver       |     at Query.execute (/app/mainserver/node_modules/mysql2/lib/commands/command.js:30:14)
mainserver       |     at Connection.handlePacket (/app/mainserver/node_modules/mysql2/lib/connection.js:417:32)
mainserver       |     at PacketParser.onPacket (/app/mainserver/node_modules/mysql2/lib/connection.js:75:12)
mainserver       |     at PacketParser.executeStart (/app/mainserver/node_modules/mysql2/lib/packet_parser.js:75:16)
mainserver       |     at Socket.<anonymous> (/app/mainserver/node_modules/mysql2/lib/connection.js:82:25)
mainserver       |     at Socket.emit (events.js:321:20)
mainserver       |     at addChunk (_stream_readable.js:297:12)
mainserver       |     at readableAddChunk (_stream_readable.js:273:9)
mainserver       |     at Socket.Readable.push (_stream_readable.js:214:10)
mainserver       |     at TCP.onStreamRead (internal/stream_base_commons.js:186:23) {
mainserver       |   name: 'SequelizeDatabaseError',

请求(sql):
Executing (default): SELECT `product`.`id`, `product`.`price`, `product`.`title`, `product`.`amount`, `product`.`description`, `product`.`picture`, `product`.`createdAt`, `product`.`updatedAt`, avg(`ratings`.`ratingValue`) AS `averageRating`, count(`ratings`.`ratingValue`) AS `amountOfRatings`, `ratings`.`id` AS `ratings.id`, `ratings`.`ratingValue` AS `ratings.ratingValue`, `ratings`.`productId` AS `ratings.productId`, `tags->ProductTag`.`createdAt` AS `tags.ProductTag.createdAt`, `tags->ProductTag`.`updatedAt` AS `tags.ProductTag.updatedAt`, `tags->ProductTag`.`productId` AS `tags.ProductTag.productId`, `tags->ProductTag`.`tagId` AS `tags.ProductTag.tagId` FROM `products` AS `product` LEFT OUTER JOIN `ratings` AS `ratings` ON `product`.`id` = `ratings`.`productId` LEFT OUTER JOIN ( `ProductTag` AS `tags->ProductTag` INNER JOIN `tags` AS `tags` ON `tags`.`id` = `tags->ProductTag`.`tagId`) ON `product`.`id` = `tags->ProductTag`.`productId` GROUP BY `product`.`id` ORDER BY `product`.`amount` DESC LIMIT 0, 3;

我需要获取带有标签的产品,以及一个有平均评分和评分数量的字段

如果你需要更多数据,我肯定会扔掉它

最佳答案

如果您使用聚合函数,那么您应该在 参数中指出所有未参与聚合函数的列。在您的情况下,这些将是:

"id",
"price",
"title",
"amount",
"description",
"picture",
"createdAt",
"updatedAt",

和 inludes 中的所有列:
attributes: ["ratingValue", "productId"]

关于javascript - Sequelize,请求带有评级和标签的产品时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60362992/

相关文章:

javascript - 具有不同高度的 Bootstrap 布局行

javascript - fadeIn 在 mouseleave(setTimeout) 之后从头开始

javascript - 使用父 Controller 方法调用测试 Angular

sql - 使用 Node.js 连接表的 GraphQL 查询

javascript - 在创建之前不适用于我的 Sequelize 模型

javascript - 围绕一个物体旋转一圈

node.js - 发布表单数据时请求正文为空

javascript - 尝试返回数据时 var 返回 undefined 并且控制台日志显示数据

python - Tchannel 服务器代码不工作。 (Python 和 Node.js)

typescript 提示解构类型