我在编写SQL SERVER 2000查询时遇到了一些麻烦。这是我的情景:
我有一个名为文件夹的表格,其中包含3列: pk_folderID , folderName 和 fk_userID 。
此外,我还有另一个名为 FolderMedia 的表,它存储了某个媒体(无论什么)属于某个文件夹。共有2列: fk_folderID , fk_media 。
最后,我有一个名为 Media 的表,它存储了一些媒体细节。它有一个主键 pk_media ,在其他列中,它有一个 MediaType 列,用于说明该媒体的类型:图片或视频。
现在,我想要一个执行以下操作的查询:
选择属于某个 fk_userID 的所有文件夹,然后获取该文件夹中的媒体数量。我在StackOverflow上看到过这样的查询,但我没有设法升级它以获得2个媒体计数(基于它们的类型)
基本上,获取属于用户的所有文件夹(fk_userID)的文件夹详细信息(名称等),并为每个文件夹获取其中的图像和视频数量(作为单独的值)。
选择基本上会返回: folderName,count(文件夹中的图像),count(文件夹中的视频),其他文件夹详细信息。
一个明显的解决方案是获取所有文件夹,然后手动计算其中的图像/视频数量......但我首先想尝试查询。
谢谢,
答案 0 :(得分:2)
基本上是这样的:
SELECT
f.pk_folderID,
f.folderName,
VideoCount = COUNT(CASE m.MediaType WHEN 'Video' THEN 1 END),
ImageCount = COUNT(CASE m.MediaType WHEN 'Image' THEN 1 END)
FROM Folder f
LEFT JOIN FolderMedia fm ON f.pk_folderID = fm.fk_folderID
LEFT JOIN Media m ON fm.fk_media = m.pk_media
WHERE f.fk_userID = @UserID
GROUP BY
f.pk_folderID,
f.folderName
更新(基于附加请求):
要在结果集中包含一种TOP 1 Media.Name
,可以像这样更改上述查询:
SELECT
f.pk_folderID,
f.folderName,
VideoCount = COUNT(CASE m.MediaType WHEN 'Video' THEN 1 END),
ImageCount = COUNT(CASE m.MediaType WHEN 'Image' THEN 1 END),
MediaName = MAX(CASE fm.timestamp WHEN t.timestamp THEN m.Name END)
FROM Folder f
LEFT JOIN FolderMedia fm ON f.pk_folderID = fm.fk_folderID
LEFT JOIN Media m ON fm.fk_media = m.pk_media
LEFT JOIN (
SELECT
fk_folderID,
timestamp = MIN(timestamp)
FROM FolderMedia
GROUP BY fk_folderID
) t ON fm.fk_folderID = t.fk_folderID AND fm.timestamp = t.timestamp
WHERE f.fk_userID = @UserID
GROUP BY
f.pk_folderID,
f.folderName
如果最小FolderMedia.timestamp
值在其文件夹中不唯一,则相应Media.Name
的最终值将由其按字母顺序排序决定。特别是,上面的查询选择了最后一个集合(MAX()
)。
答案 1 :(得分:0)
从Folders
表格中获取所需的所有数据,将其加入FolderMedia
和Media
使用内置sum
的{{1}}来计算所有视频和图片。
case
答案 2 :(得分:0)
//选择folderName,count(Folders.pk_folderID然后其他1结束时的情况)
count(SELECT FolderMedia.fk_media from FolderMedia JOIN Media on fk_media=pk_media where image is not null) as nrImg
等。
答案 3 :(得分:0)
这是一个包含一些示例数据的查询。希望它有所帮助。
declare @Folders table (pk_folderID int, folderName varchar(32), fk_userID int)
declare @Media table (pk_media int, name varchar(50), type varchar(32))
declare @FolderMedia table (fk_folderID int, fk_media int)
insert into @Folders values (1, 'Folder1', 1000)
insert into @Folders values (2, 'Folder2', 1000)
insert into @Folders values (3, 'Folder1', 2000)
insert into @Folders values (4, 'Folder1', 2000)
insert into @Media values (1, 'graph.jpg', 'image')
insert into @Media values (2, 'timer.jpg', 'image')
insert into @Media values (3, 'timer1.jpg', 'image')
insert into @Media values (4, 'harry_potter.mpeg', 'video')
insert into @Media values (5, 'harry_potter1.mpeg', 'video')
insert into @Media values (6, 'harry_potter2.mpeg', 'video')
insert into @FolderMedia values (1, 1)
insert into @FolderMedia values (1, 3)
insert into @FolderMedia values (1, 6)
insert into @FolderMedia values (2, 2)
insert into @FolderMedia values (2, 4)
select folderName, fk_userID, imageData.imgCount, videoData.videoCount from
@Folders
left outer join
(
select fk_folderID, COUNT(*) as imgCount
from @FolderMedia
inner join @Media
on fk_media = pk_media
and type = 'image'
group by fk_folderID
) as imageData
on imageData.fk_folderID = pk_folderID
left outer join
(
select fk_folderID, COUNT(*) as videoCount
from @FolderMedia
inner join @Media
on fk_media = pk_media
and type = 'video'
group by fk_folderID
) as videoData
on videoData.fk_folderID = pk_folderID
where fk_userID = 1000