0

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

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

那可能吗?这可能在一个声明中吗?

4

1 回答 1

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

于 2013-03-25T15:52:53.530 回答