0

次のようなusersテーブルがあると仮定します。

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

他にも2つのテーブルがあり、ユーザーごとに、ユーザーがインスタンス、ビデオ、および写真に対して「持っている」アイテムを記録し、ビデオテーブルが次のようになっていると仮定します。

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

これはSQLServerの例ですが、他の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 に答える