#javascript #mysql #sequelize.js
#javascript #mysql #sequelize.js
Вопрос:
Я использую sequelize и mysql2, и мне нужно выбрать все различные значения из нескольких столбцов. Например, у меня есть столбец «Заголовок» и «Местоположение».
На данный момент это:
Job.findAll({
attributes: [
[Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title']
]
})
работает, возвращая все названия заданий, которые отличаются. Но если я добавлю вторую строку для столбца местоположения, я получу синтаксическую ошибку
Job.findAll({
attributes: [
[Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title'],
[Sequelize.fn('DISTINCT', Sequelize.col('location')), 'location']
]
})
Кажется, что это должно сработать, по крайней мере, из того, что я прочитал в документах, но я не совсем опытен или уверен в sequelize, поэтому буду признателен за любую помощь.
Спасибо
Ответ №1:
Я еще не нашел способ сделать это менее хакерски, но вы можете использовать тот факт, что DISTINCT на самом деле не функция, а оператор и всегда работает со всем выбранным набором столбцов:
Job.findAll({
attributes: [
[Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title'],
'location'
]
})
будет генерировать SQL, подобный
SELECT DISTINCT(`title`) AS `title`, `location` FROM `Jobs`;
но поскольку DISTINCT не является функцией, это действительно то же самое, что
SELECT DISTINCT (`title`) AS `title`, `location` FROM `Jobs`;
который делает то, что вы хотите, потому что круглые скобки вокруг имен столбцов необязательны, этот запрос там будет таким же, как
SELECT DISTINCT `title`, `location` FROM `Jobs`;
Источник:https://dzone.com/articles/sql-distinct-is-not-a-function (в статье также говорится о расширении DISTINCT В PostgreSQL, если кому-то это тоже понадобится)
Пожалуйста, обратите внимание, что это кажется очень сложным и хрупким и может / может сломаться, если Sequelize когда-либо решит изменить способ применения функций при генерации SQL, но это работает в версии Sequelize, которую я использую (5.22.3).
Комментарии:
1. Спасибо за идею, но оказывается, что — по крайней мере, за то, что я хотел сделать, я слишком усложнял ситуацию: следующее, похоже, возвращает отдельный список обоих:
Job.findAll({attributes: ['title', 'location'], group: ['title', 'location']})
. Приветствия!