选择带有标签的产品及其评级的请求的问题。我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/