2

我有 2 张桌子:媒体和画廊。媒体包含数千条不同类型的病毒媒体记录,如视频、图片、游戏等。画廊包含与媒体表中的图片记录组相关联的画廊 ID 列表。

我的桌子

目前,我有一个查询,它将返回 Gallery 表中的 Gallery 记录列表,并将 MediaThumb 与 Media 表中相应的 GalleryIds 组关联。这是该查询:

SELECT a.GalleryID, a.GalleryTitle, a.GalleryDate, MAX(b.MediaThumb) AS MediaThumb
FROM Galleries a
INNER JOIN Media b
ON a.GalleryID = b.GalleryID
GROUP BY a.GalleryID, a.GalleryTitle, a.GalleryDate
order by a.GalleryID desc

我现在想提出的是一个查询,它返回画廊记录列表以及 MediaTypeID = 1 或 2 或 3 的媒体表中的所有记录。

我不太擅长复杂的 SQL,可以使用某种方向/帮助。我什至不确定我想要的是否可能。我需要将上面的查询与 Media 表中的记录交织在一起。希望你们中的一些 SQL 大师可以伸出援助之手!

谢谢!

4

2 回答 2

4

如果您想要图库和最大缩略图以及关联的媒体行,请使用:

; WITH CTE AS (
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
                    ORDER BY b.MediaThumb DESC) AS Rn
FROM Galleries a
INNER JOIN Media b
ON a.GalleryID = b.GalleryID
Where b.MediaTypeID in (1,2,3)
)
SELECT * FROM CTE where Rn = 1

上述查询的示例数据和结果 - http://sqlfiddle.com/#!3/09e4f/1

根据我们在聊天中的讨论更新了查询:

WITH CTE AS (
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
                    ORDER BY b.MediaThumb DESC) AS Rn
FROM Media b
INNER JOIN Gallery A
ON a.GalleryID = b.GalleryID
), 
CTE2 AS
(
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
1 Rn
FROM Media b
LEFT OUTER JOIN Gallery A
ON a.GalleryID = b.GalleryID
)
SELECT * FROm CTE where rn = 1
UNION ALL
SELECT * FROM CTE2 WHERE rn = 1 and galleryid is null
order by mediaid

上面的小提琴 - http://sqlfiddle.com/#!3/72935/12

于 2012-08-24T17:06:54.467 回答
0

您只需要使用连接而不分组...左外连接将确保所有画廊都被拾取...即。没有任何相应媒体的画廊也会被选中。

SELECT a.*, b.*
FROM Galleries a
Left outer JOIN Media b ON a.GalleryID = b.GalleryID
Where b.MediaTypeID in (1,2,3)
于 2012-08-24T17:06:09.230 回答