Я попытаюсь объяснить вам, что это за ошибка. Начиная с MySQL 5.7.5, опция ONLY_FULL_GROUP_BY
включена по умолчанию. Таким образом, согласно стандарту SQL92 и ранее:
не разрешает запросы, для которых список выбора, условие HAVING или список ORDER BY относятся к неагрегированным столбцам, которые не имеют ни имени в предложении GROUP BY, ни функционально зависимы от (однозначно определенных) столбцами GROUP BY
Итак, например:
SELECT * FROM `users` GROUP BY `name`;
После выполнения запроса вы получите сообщение об ошибке.
# 1055 - Выражение # 1 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец «testite». user.id ', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by
Почему? Поскольку MySQL точно не понимает, какие определенные значения из сгруппированных записей извлекаются, и это точка.
I.E. скажем, у вас есть эти записи в вашей таблице
users
:И вы выполните недопустимый запрос, показанный выше. И вы получите ошибку, показанную выше, потому что есть 3 записи с именем
John
, и это хорошо, но все они имеют разные значения полейВы можете исправить эту проблему, просто изменив свой запрос следующим образом:
SELECT `name` FROM `users` GROUP BY `name`
Также , вы можете захотеть добавить больше полей в секцию SELECT, но вы не можете это сделать, если они не агрегированы, но есть костыль, который вы могли бы использовать (но сильно не рекомендовано):
SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`
Теперь вы можете спросить, почему использование
ANY_VALUE
настоятельно не рекомендуется? Поскольку MySQL точно не знает, какое значение сгруппированных записей извлекается, и с помощью этой функции вы просите ее получить любую из них (в этом случае было отправлено электронное письмо первой записи с именем = John). Именно я не могу придумать какие-либо идеи о том, почему вы хотите, чтобы это поведение существовало. Пожалуйста, если вы меня не понимаете, читайте больше о том, как работает группировка в MySQL, это очень просто.И к концу, вот еще один простой, но действительный запрос. Если вы хотите запросить общий подсчет пользователей в соответствии с доступными возрастами, вы можете записать этот запрос
SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;
, который является полностью действительным, в соответствии с правилами MySQL. И так далее. Важно понять, в чем проблема, и только потом записать решение.
Это один из основных вариантов использования промежуточного программного обеспечения Mongoose 'remove'
.
clientSchema.pre('remove', function(next) {
// 'this' is the client being removed. Provide callbacks here if you want
// to be notified of the calls' result.
Sweepstakes.remove({client_id: this._id}).exec();
Submission.remove({client_id: this._id}).exec();
next();
});
Таким образом, когда вы вызываете client.remove()
, это промежуточное программное обеспечение автоматически вызывается очистить зависимости.
Другим способом я нашел
submissionSchema.pre('remove', function(next) {
this.model('Client').remove({ submission_ids: this._id }, next);
next();
});
Если ваши ссылки хранятся иначе, скажем, client
имеет массив из submission_ids
, то аналогично принятому ответу вы можете определить следующее на submissionSchema
:
submissionSchema.pre('remove', function(next) {
Client.update(
{ submission_ids : this._id},
{ $pull: { submission_ids: this._id } },
{ multi: true }) //if reference exists in multiple documents
.exec();
next();
});
, который удалит идентификатор отправки из ссылочных массивов клиентов в submission.remove()
.