使用另一个表中的Count()值来排序sql结果

时间:2013-03-25 15:40:19

标签: sql sql-order-by

假设我们有这样的用户表:

ID  |  USERNAME  |  STATUS  |
01  |  Aname     |    1     |
02  |  Bname     |    1     |
03  |  Cname     |    2     |
04  |  Dname     |    1     |

还有另外两个表,其中,对于每个用户,记录用户“拥有”的项目,视频和照片,让我们假设视频表是这样的:

ID  |  USER      |  VIDEO   |
01  |  01        |   aaaa   |
02  |  01        |   bbbb   |
03  |  02        |   cccc   |
04  |  02        |   dddd   |
05  |  03        |   eeee   |
06  |  03        |   ffff   |
07  |  03        |   gggg   |

照片也一样:

ID  |  USER      |  PHOTO   |
01  |  01        |   aaaa   |
02  |  02        |   cccc   |
03  |  02        |   dddd   |
04  |  03        |   eeee   |
05  |  03        |   ffff   |
06  |  03        |   gggg   |

现在,我正在尝试在STATUS字段上排序第一个表的结果,因此状态为2的用户将在结果的末尾(或开头),但我想通过他们拥有或没有视频或照片的事实来订购其他人。实际上,对于处于状态1的所有用户,我检查他们是否有视频和照片并显示“警告,你没有视频”等信息,我还想在状态的基础上订购所有用户以及事实他们有或没有照片或视频...像:

SELECT id,username,status,NumOfPhotos,NumOfVideos order by status ASC, numOfPhotos ASC, NumOfVideos DESC

其中NumOfPhotos,例如SELECT COUNT(*) FROM PHOTOS WHERE USER = USERS.ID

这可能吗?这是可能的吗?

1 个答案:

答案 0 :(得分:2)

这是SQL Server上的一个示例,但类似的内容应该适用于其他RDBMS

SELECT 
id, username, status, COALESCE(NumOfPhotos,0) AS NumOfPhotos,COALESCE(NumOfVideos,0) AS NumOfVideos 
FROM dbo.Users u 
LEFT JOIN (SELECT [USER], COUNT(*) AS NumOfPhotos FROM dbo.Photos GROUP BY [USER]) ph ON ph.[USER] = u.ID
LEFT JOIN (SELECT [USER], COUNT(*) AS NumOfVideos FROM dbo.Videos GROUP BY [USER]) vd ON vd.[USER] = u.ID
ORDER BY status ASC, numOfPhotos ASC, NumOfVideos DESC

SQLFiddle