Получите одно лучшее изображение для каждой категории - PullRequest
0 голосов
/ 01 февраля 2012

Я сгруппировал фотографии по категориям.(2 таблицы категорий и фотографии с полем catID)

У меня есть запрос, который возвращает список категорий и количество фотографий, которые он имеет, и изображение его верхней фотографии (каждая запись имеет поле IsTop).

Но это не работает должным образом.он просто возвращает imagepath для первой записи.для остальных возвращает нуль

select
T3.ImagePath,T2.ID,T2.Title,T2.ItemsCount 
from (
select C.Title,C.ID,Count(Ph.CatID) as ItemsCount from Categories C
    left Outer join (select CatID from photos) Ph
    on C.ID=Ph.CatID group by C.Title,C.ID) T2 
left outer join 
(select top 1 ImagePath,CatID from photos where IsTop=1 order by id desc) T3 
on T2.ID=T3.CatID 
group by T3.ImagePath,T2.ID,T2.Title,T2.ItemsCount;

1 Ответ

1 голос
/ 01 февраля 2012

Предполагая, что вы работаете на SQL Server 2005 или более поздней версии, вы можете использовать оконную функцию :

select
T3.ImagePath,T2.ID,T2.Title,T2.ItemsCount 
from (
select C.Title,C.ID,Count(Ph.CatID) as ItemsCount from Categories C
    left Outer join (select CatID from photos) Ph
    on C.ID=Ph.CatID group by C.Title,C.ID) T2 
left outer join 
(select ImagePath,CatID,ROW_NUMBER() OVER (PARTITION BY CatID ORDER BY ID desc) as rn from photos where IsTop=1) T3 
on T2.ID=T3.CatID and rn = 1 /* <-- New join condition also */
group by T3.ImagePath,T2.ID,T2.Title,T2.ItemsCount;

В этом случае это позволяет нам нумеровать строки с помощьюНомера строк присваиваются независимо для каждого CatID (бит PARTITION BY) и с определенным порядком.Для каждого CatID мы снова начинаем присваивать номера строк, начиная с 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...