Sequelize: выбор различных значений полей из нескольких столбцов

#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']}) . Приветствия!