1

フォト ギャラリーに 5 つのテーブルを使用して、さまざまな情報を保存しています

写真、PhotoDetails、PhotoMappings、PhotoAlbum、PhotoAlbumCategory。

これは多言語ウェブサイトです。アルバム用の写真を一度アップロードして、どの言語バージョンのウェブサイトでも共有したいと考えています。

必要な手順。

  1. 写真テーブルに写真を追加します
  2. 次に、PhotoMapping テーブルの (LanguageID、AlbumID、AlbumCategoryID) と共に写真を特定のアルバムにマップします。
  3. 3番目に、タイトル、説明、日付などの特定の写真に関連する詳細を追加する必要があります...

詳細を追加するには、特定のアルバムの下にある写真のユーザー リストを、この写真の詳細が Photodetails テーブルにあるかどうかに基づいて、YES/NO などの追加情報とともに表示したいと考えています。

PhotoDetails
    [PhotoDetailsID] [int] IDENTITY(1,1) NOT NULL,
    [PhotoTitle] [nvarchar](300) NULL,
    [PhotoDesc] [nvarchar](max) NULL,
    [PhotoDate] [date] NULL,
    [PhotoVisible] [bit] NULL,
    [PhotoID] [int] NOT NULL,
    [AlbumID] [int] NULL,
    [LanguageID] [int] NULL,
    [PhotoDetailsCreatedOn] [date] NULL

PhotoMappings
    [MappingID] [int] IDENTITY(1,1) NOT NULL,
    [LanguageID] [int] NULL,
    [CategoryID] [int] NULL,
    [AlbumID] [int] NULL,
    [PhotoID] [int] NULL,

Photos
    [PhotoID] [int] IDENTITY(1,1) NOT NULL,
    [PhotoTN] [nvarchar](100) NULL,
    [PhotoLarge] [nvarchar](100) NULL,
    [PhotoGUID] [nvarchar](50) NULL,
    [PhotoCreatedOn] [date] NULL,


SELECT d.PhotoTitle,d.AlbumID,p.PhotoTN AS TN,  p.PhotoID AS PID,p.PhotoLarge AS PL,
case when d.PhotoId is null then 'NO' else 'YES' end AS [Details]
FROM Photos p  JOIN  PhotoDetails d
ON  p.PhotoId = d.PhotoId JOIN PhotoMappings m
ON  p.PhotoId = m.PhotoId WHERE d.AlbumID  = 14 and m.LanguageID = 1

PhotoMapping テーブルのすべてのレコードと、PhotoDetails テーブルに存在しない行を表示するクエリを作成する必要があります。

上記のクエリを使用していますが、目的の結果が得られますが、PhotoDetails テーブルに存在しない列は表示されません

OUTPUT を以下のようにしたいのですが、AlbumID=14 & Language =1 のアルバムに関する詳細が必要だとします (クエリから最初の 6 行のみを取得します)。

PhotoTitle      AlbumID TN      PID PL  Details         
Title of Photo1 14      1Icon.JPG   16  1.JPG   YES
Title of Photo2 14      2Icon.JPG   21  2.JPG   YES
Title of Photo3 14      3Icon.JPG   20  3.JPG   YES
Title of Photo4 14      4Icon.JPG   22  4.JPG   YES
Title of Photo5 14      5Icon.JPG   18  5.JPG   YES
Title of Photo6 14      6Icon.JPG   17  6.JPG   YES
Title of Photo7 14      7Icon.JPG   23  7.JPG   NO
Title of Photo8 14      8Icon.JPG   24  8.JPG   NO

私は&に変更JOINしましたが、出力は同じままであることに関して、これについて助けていただければ幸いですLEFT OUTER JOINRIGHT OUTER JOIN

サンプルデータ

マッピング表

MappingID   LanguageID  CategoryID  AlbumID PhotoID
1   1   7   14  16
2   1   7   14  21
3   1   7   14  20
4   1   7   14  22
5   1   7   14  19
6   1   7   14  18
7   1   7   14  17
8   1   7   14  23

PhotoDetails テーブルのサンプル データ

PhotoDetailsID  PhotoTitle  PhotoDate   PhotoVisible    PhotoID AlbumID LanguageID  PhotoDetailsCreatedOn
20  Title of Photo1     2012-07-02  1   16  14  1   2012-02-07
21  Title of Photo2     2012-07-02  1   17  14  1   2012-02-07
22  Title of Photo3     2012-07-02  1   18  14  1   2012-02-07
24  Title of Photo4     2012-07-02  1   20  14  1   2012-02-07
25  Title of Photo5     2012-07-02  1   21  14  1   2012-02-07
26  Title of Photo6     2012-07-02  1   22  14  1   2012-02-07
23  Title of Photo7     2012-07-02  1   19  10  1   2012-02-07
27  Title of Photo8     2012-07-02  1   23  13  1   2012-02-07
34  Something       2012-07-02  1   14  13  1   2012-02-07
35  Something       2012-03-20  1   37  17  1   2012-03-07
36  Something       2012-03-13  1   38  10  1   2012-03-07
4

2 に答える 2

1

私の意見では、次の 2 つのことを変更する必要があります。AlbumID のフィルターは、PhotoDetail ではなく PhotoMappings から取得する必要があり、PhotoDetails で左結合する必要があります。

SELECT d.PhotoTitle,
       m.AlbumID,
       p.PhotoTN AS TN,
       p.PhotoID AS PID,
       p.PhotoLarge AS PL,
       case when d.PhotoId is null 
            then 'NO' 
            else 'YES' 
        end AS [Details]
  FROM Photos p
 INNER JOIN PhotoMappings m
    ON p.PhotoId = m.PhotoId
  LEFT JOIN  PhotoDetails d
    ON p.PhotoId = d.PhotoId
 WHERE m.AlbumID = 14
   and m.LanguageID = 1
于 2012-07-23T09:50:01.753 に答える
0

PhotoMappings が機能する前に、outer JOIN を残します。

SELECT d.PhotoTitle,d.AlbumID,p.PhotoTN AS TN,  p.PhotoID AS PID,
p.PhotoLarge AS PL,
case when d.PhotoId is null then 'NO' else 'YES' end AS [Details]
FROM Photos p  JOIN  PhotoDetails d
ON  p.PhotoId = d.PhotoId 
left outer JOIN PhotoMappings m
ON  p.PhotoId = m.PhotoId 
WHERE d.AlbumID  = 14 and m.LanguageID = 1
于 2012-07-23T09:41:32.317 に答える