У меня есть 3 стола с закусками, рейтингами и пользователями.
закуски (id,snack_name,address,cover,profile,phone);
рейтинги (id,grade,comment,snackId,userId<34420180830249>);
users(id,имя пользователя,электронная почта,пароль); и вот отношения между ними: Что я хочу сделать, так это получить 5 лучших закусок на основе их оценок (оценка: инт)
и вот что я сделал : и когда я использовал почтальон, чтобы увидеть ответ, я получил это: и это ответ без группировки и порядка // snack and user (1-M)
db.user.hasMany(db.rating);
db.rating.belongsTo(db.user);
// snack and rating (1-M)
db.snack.hasMany(db.rating);
db.rating.belongsTo(db.snack);
exports.topSnacks = async(req, res) => {
let transaction;
try{
transaction = await db.sequelize.transaction();
await Snack.findAll({
attributes: [
'snack_name',
'address'
],
include: {
model: Rating,
required : true,
},
order : [
[sequelize.fn('max', sequelize.col('grade')), "DESC"]
],
group: "ratings.snackId",
limit : 5
})
.then(topSnacks => {
res.status(200).json(topSnacks);
transaction.commit();
})
}catch(error) {
console.log(error);
res.status(500).json({
message: "Error!",
error: error.message
});
await transaction.rollback();
}
}
{
"message": "Error!",
"error": "column "snack.id" must appear in the GROUP BY clause or must be used in an aggregate function"
}
[
{
"snack_name": "come n eat",
"address": "near cool down street",
"ratings": [
{
"id": 1,
"grade": 10,
"comment": "excellent",
"createdAt": "2021-07-01T15:15:20.792Z",
"updatedAt": "2021-07-01T15:15:20.792Z",
"snackId": 1,
"userId": 1
},
{
"id": 2,
"grade": 8,
"comment": "amazing snack",
"createdAt": "2021-07-01T15:15:56.179Z",
"updatedAt": "2021-07-01T15:15:56.179Z",
"snackId": 1,
"userId": 2
},
{
"id": 3,
"grade": 4,
"comment": "bad snack",
"createdAt": "2021-07-01T15:16:15.856Z",
"updatedAt": "2021-07-01T15:16:15.856Z",
"snackId": 1,
"userId": 3
}
]
},
{
"snack_name": "snack houssam",
"address": "rue zalaqa",
"ratings": [
{
"id": 4,
"grade": 7,
"comment": "enough good",
"createdAt": "2021-07-01T15:16:38.279Z",
"updatedAt": "2021-07-01T15:16:38.279Z",
"snackId": 2,
"userId": 3
}
]
},
{
"snack_name": "snack taj",
"address": "rue el firdaous",
"ratings": [
{
"id": 5,
"grade": 2,
"comment": "very bad",
"createdAt": "2021-07-01T15:16:56.192Z",
"updatedAt": "2021-07-01T15:16:56.192Z",
"snackId": 3,
"userId": 3
},
{
"id": 6,
"grade": 5,
"comment": " not bad",
"createdAt": "2021-07-01T15:17:37.401Z",
"updatedAt": "2021-07-01T15:17:37.401Z",
"snackId": 3,
"userId": 4
}
]
}
]