2015-10-11 2 views
2

У меня есть таблица Stories и таблица Post. Каждый Story содержит многократный Posts (Story.hasMany(models.Post);, Post.belongsTo(models.Story);)Найти последние n записей, упорядоченных по ассоциации

То, что я пытаюсь достичь в список первых 10 Истории заказанные Posts.createdAt. Таким образом, возможно, что первая запись - старейшая история, но с очень новой Почтой.

То, что я пытаюсь сейчас заключается в следующем:

var options = { 
    limit: 10, 
    offset: 0, 
    include: [{ 
     model: models.sequelize.model('Post'), 
     attributes: ['id', 'createdAt'], 
     required: true 
    }], 
    order: [ 
     [models.sequelize.model('Post'), 'createdAt', 'DESC'], 
     ['createdAt', 'DESC'] 
    ], 
    attributes: ['id', 'title', 'createdAt'] 
}; 

Story.findAll(options)... 

Что дает мне этот SQL-запрос:

SELECT "Story".*, "Posts"."id" AS "Posts.id", "Posts"."createdAt" AS "Posts.createdAt" 
FROM (SELECT "Story"."id", "Story"."title", "Story"."createdAt" 
     FROM "Stories" AS "Story" 
     WHERE (SELECT "StoryId" 
       FROM "Posts" AS "Post" 
       WHERE ("Post"."StoryId" = "Story"."id") LIMIT 1) IS NOT NULL 
     ORDER BY "Story"."createdAt" DESC LIMIT 10) AS "Story" 
    INNER JOIN "Posts" AS "Posts" ON "Story"."id" = "Posts"."StoryId" 
ORDER BY "Posts"."createdAt" DESC, "Story"."createdAt" DESC; 

Проблема здесь состоит в том, что если 11-й элемент имеет очень новый пост он не отображается в верхнем списке 10.

Как я могу получить ограниченный список историй, заказанных Posts.createdAt?

ответ

2

Почему вы используете два вложенных подзадачи? Это неэффективно, может создавать дорогие вложенные циклы и все равно не возвращает то, что вы ищете.

В начале, вы можете перекрестно присоединяться к статьям и сообщениям, заказывать по метке времени создания из Сообщений. Но это все равно может сканировать всю таблицу.

Посмотрите на этой презентации:. http://www.slideshare.net/MarkusWinand/p2d2-pagination-done-the-postgresql-way Но я понятия не имею, как вы можете принести, что в модель :-(

+0

Спасибо за SlideShare мне очень нравится идея опуская смещения. –

Смежные вопросы