2017-02-15 9 views
0

Я использую Sequelize 3.30.0 с Postgres. Это запрос, я хочу, чтобы выполнить:Sequelize PG: select with join, order, limit

SELECT works.title, artists.name, artists.relevance 
FROM works 
JOIN artist_works ON works.work_id = artist_works.work_id 
JOIN artists ON artists.artist_id = artist_works.artist_id 
WHERE artists.label LIKE '%mozart%' 
ORDER BY artists.relevance DESC 
LIMIT 50 

Это очень просто и работает как шарм, если я делаю это прямо на дб. Однако попытка сделать то же самое с Sequelize не работает (никаких результатов). Это как findAll варианты выглядеть следующим образом:

Work.findAll({ 
    attributes : ['title'], 
    include : [{ 
     attributes : [ 'name' ], 
     model : Artist, 
     where : { label : { $like : '%mozart%' } }, 
    }], 
    limit : 50 
}) 

Sequelize сгенерированный запрос очень запутанным:

SELECT "works".*, "artists"."artist_id" AS "artists.artistId", "artists"."name" AS "artists.name", "artists.artist_works"."artist_work_id" AS "artists.artist_works.artistWorkId", "artists.artist_works"."artist_id" AS "artists.artist_works.artistId", "artists.artist_works"."work_id" AS "artists.artist_works.workId", "artists.artist_works"."type" AS "artists.artist_works.type", "artists.artist_works"."artist_id" AS "artists.artist_works.artist_id", "artists.artist_works"."work_id" AS "artists.artist_works.work_id" 
FROM (
    SELECT "works"."work_id" AS "workId", "works"."title" 
    FROM "works" AS "works" 
    WHERE ( 
     SELECT "artist_works"."artist_work_id" 
     FROM "artist_works" AS "artist_works" 
     INNER JOIN "artists" AS "artist" ON "artist_works"."artist_id" = "artist"."artist_id" 
     WHERE ("works"."work_id" = "artist_works"."work_id") LIMIT 1 
    ) IS NOT NULL 
    LIMIT 50) AS "works" 
INNER JOIN (
    "artist_works" AS "artists.artist_works" 
     INNER JOIN "artists" AS "artists" ON "artists"."artist_id" = "artists.artist_works"."artist_id" 
    ) ON "works"."workId" = "artists.artist_works"."work_id" AND "artists"."label" LIKE '%-mozart-%'; 

Пожалуйста, обратите внимание, что запрос работает, если никаких ограничений не установлено. Кроме того, при попытке добавить параметр order запрос замерзает. Идеи?

ответ

1

Там существует связанный с этим вопрос Sequelize with NodeJS can't join tables with limit, и решение, кажется, добавить subQuery: false к options объекта в findAll методом. Это предотвращает создание этого подзапроса, к которому вы относитесь.

Я создал идентичную ассоциацию и добавил subQuery: false, и подзапрос не сгенерирован, а также LIMIT и ORDER, кажется, сработают. Тем не менее, я предлагаю взглянуть на исходный код selectQuery от node_modules/sequelize/lib/dialects/abstract/query-generator.js, если вы действительно хотите использовать опцию subQuery, потому что он не упоминается в документации, поэтому я не гарантирую, что он будет работать

+0

'subQuery: false' решает проблема действительно. Благодаря! –