2015-10-19 2 views
1

У меня есть отношение 1-n между collections и images таблицами.Внутреннее соединение таблицы с использованием предела

Моя цель - выбрать все коллекции при условии, что вместе с тремя верхними изображениями любой найденной коллекции.

Как сделать это сейчас:

Запрос на коллекции:

SELECT * FROM "collections" WHERE SOME_CONDITION 

После выбора всех коллекций, я выполнить запрос как это для каждой коллекции:

SELECT * FROM "images" WHERE "images"."collection_id" = MY_CURRENT_COLLECTION_ID LIMIT 3 

Моя цель для этого в одном запросе:

SELECT "images".* 
    ,"collections".* 
FROM "collections" 
INNER JOIN (SOME_MAGIC_TO_GET_THE_TOP_THREE_IMAGES_FOR_EACH_COLLECTION) AS "images" ON "images"."collection_id" = "collections"."id" 
WHERE SOME_CONDITION 

Любая идея?

P.S. Я использую postgresql.

ответ

3

Это может быть сделано с помощью window function:

SELECT img.*, 
     collections.* 
FROM collections 
    JOIN (
    select *, 
      row_number() over (partition by collection_id order by something) as rn 
    from images 
) img ON img.collection_id = collections.id AND img.rn <= 3 
WHERE ....; 

Обратите внимание, что назначая row_number() работает только в стабильном пути, если вы можете заказать строки что-то. something в заявлении, приведенном выше, представляет собой любой столбец в вашей таблице images, который позволит вам правильно отсортировать эти строки, например. дату последней модификации или дату создания или что-то подобное. Вам, видимо, нужно заменить something существующим столбцом.

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