столбец "snack.id" должен присутствовать в предложении GROUP BY или должен использоваться в агрегатной функции.

avatar
Zidan Badr
1 июля 2021 в 17:02
53
0
0

У меня есть 3 стола с закусками, рейтингами и пользователями.

закуски (id,snack_name,address,cover,profile,phone);

рейтинги (id,grade,comment,snackId,userId<34420180830249>);

users(id,имя пользователя,электронная почта,пароль);

и вот отношения между ними:

// 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);

Что я хочу сделать, так это получить 5 лучших закусок на основе их оценок (оценка: инт) и вот что я сделал :

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
            }
        ]
    }
]

Источник

Ответы (0)