SQL Query从另一个SQL查询中选择COUNT

时间:2011-07-29 06:07:30

标签: sql sql-server-2000

我在编写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(文件夹中的视频),其他文件夹详细信息。

一个明显的解决方案是获取所有文件夹,然后手动计算其中的图像/视频数量......但我首先想尝试查询。

谢谢,

4 个答案:

答案 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表格中获取所需的所有数据,将其加入FolderMediaMedia 使用内置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