2010-03-31 5 views
0

В базе данных есть таблицы Фотографии и фотоальбомы. Мне нужен запрос, который выберет все альбомы и только одну фотографию из каждого альбома. Мне нужна версия SQL и LINQ этого запроса. Заранее спасибо.sql и linq query

+0

Какие фото из каждого альбома вы хотите? –

+0

на данный момент любая фотография .. позже я отредактирую таблицу фотографий так, что у нее есть поле «albumcover», но теперь мне нужен случайный номер –

+0

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

ответ

1

В Linq я не испытал, что в нем, так что я буду только дать SQL Server Query

SELECT a.*,b.MyPhoto FROM PhotoAlbums a,(SELECT Top 1 myPhoto from Photos Where AlbumID = a.ID) b 

или Этот

SELECT a.AlbumID, a.Title, a.Date, (SELECT TOP (1) c.PhotoID FROM Photos c WHERE(c.AlbumID = a.AlbumID)) AS PhotoID FROM PhotoAlbums as a 
+0

Пожалуйста, см. Мой новый вопрос –

1

если таблицы, как:

PhotoAlbums 
AlbumID PK 
... 

Photos 
PhotoID PK 
AlbumID FK 
Photo 
... 
:

вот SQL-запрос:

SELECT 
    a.*,p.Photo 
    FROM PhotoAlbums a 
     LEFT OUTER JOIN (SELECT 
          AlbumID,MIN(PhotoID) AS MinPhotoID 
          FROM Photos 
          GROUP BY AlbumID 
         ) dt ON a.AlbumID=dt.AlbumID 
     LEFT OUTER JOIN Photos p ON dt.MinPhotoID=p.PhotoID 

рабочий пример:

DECLARE @PhotoAlbums table (AlbumID int) 
INSERT @PhotoAlbums VALUES (1) 
INSERT @PhotoAlbums VALUES (2) 
INSERT @PhotoAlbums VALUES (3) 

DECLARE @Photos table (PhotoID int,AlbumID int, Photo varchar(10)) 
INSERT @Photos VALUES (1,1,'A') 
INSERT @Photos VALUES (2,1,'B') 
INSERT @Photos VALUES (3,1,'C') 
INSERT @Photos VALUES (4,2,'AA') 
INSERT @Photos VALUES (5,3,'AAA') 
INSERT @Photos VALUES (6,3,'BBB') 

SELECT 
    a.*,p.Photo 
    FROM @PhotoAlbums a 
     LEFT OUTER JOIN (SELECT 
          AlbumID,MIN(PhotoID) AS MinPhotoID 
          FROM @Photos 
          GROUP BY AlbumID 
         ) dt ON a.AlbumID=dt.AlbumID 
     LEFT OUTER JOIN @Photos p ON dt.MinPhotoID=p.PhotoID 

ВЫВОД:

AlbumID  Photo 
----------- ---------- 
1   A 
2   AA 
3   AAA 

(3 row(s) affected) 
+0

hmmm ... Когда я пытаюсь выполнить ваш запрос и Kronass, VS2008 форматирует запрос, а затем возвращает ошибку. Является ли SQL одинаковым для MySQL и MSSQL? –

+0

И да, таблицы, как вы предполагали, –

+0

и сообщение об ошибке было бы? –

1

Запрос Linq может быть что-то вроде этого:

from album in context.PhotoAlbums 
from photo in album.Photos.Take(1).DefaultIfEmpty() 
select new 
    { 
     Album = album, 
     Photo = photo 
    } 
+0

Это работает! благодаря –