2010-03-31 126 views
0

数据库有表格照片和PhotoAlbums。我需要一个查询来选择所有专辑和每张专辑中只有一张照片。我需要此查询的SQL和LINQ版本。提前致谢。sql和linq查询

+0

你想从每个相册里面的照片? – 2010-03-31 10:50:18

+0

现在任何照片..后来我会编辑表照片,以便它有字段“albumcover”,但现在我需要随机一个 – 2010-03-31 10:51:42

+0

您选择的查询效率低下,因为它必须运行不同的查询来查找返回的每一行的照片来自PhotoAlbums。使用派生表并将PhotoAlbum添加到该表中会更好。 – 2010-03-31 12:55:50

回答

1

在LINQ我不是在它经历,所以我只会给SQL Server查询

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

请参阅我的新问题 – 2010-03-31 12:07:40

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 

OUTPUT:

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

(3 row(s) affected) 
+0

hmmm ...当我尝试执行您的和Kronass的查询时,VS2008格式化查询,然后返回错误。对于MySQL和MSSQL,SQL是否相同? – 2010-03-31 11:21:42

+0

是的,表格就像你假设 – 2010-03-31 11:22:01

+0

和错误信息会是? – 2010-03-31 11:24:15

1

LINQ查询可能是这样的:

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

这个工程!谢谢 – 2010-03-31 13:48:01