2012-07-23 75 views
1

我用5表我的照片庫來存儲不同的信息SQL查詢來獲取想要的結果從三個表

照片,PhotoDetails,PhotoMappings,天地我的相簿,PhotoAlbumCategory。

這是一個多語種網站&我想上傳一張專輯的照片&與任何語言版本的網站分享。

涉及的步驟。

  1. 我將照片添加到照片表
  2. 其次我映射的照片,以特別專輯(LanguageID,ALBUMID,AlbumCategoryID)在PhotoMapping表
  3. 第三,我需要添加與像標題特定的照片細節一起,描述,日期...

爲了添加詳細信息,我想顯示特定相冊下的用戶列表以及附加信息,如YES/NO,基於該照片的詳細信息是否在Photodetails表中。

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表

我想輸出到像,如下所示假設我要列有關的詳細信息,其中專輯ALBUMID = 14 &語言= 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 

我希望關於我沒有改變JOINLEFT OUTER JOIN & RIGHT OUTER JOIN,但放出來一樣保持在此幫助

示例數據

映射表從PhotoDetails表

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 

示例數據

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 

回答

1

在我看來,您需要更改兩件事:對AlbumID的過濾應該來自PhotoMappings,而不是PhotoDetail,並且您需要在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 
+0

@KnowledgeSeeker請檢查我的修改後的查詢。 – 2012-07-23 09:56:57

+0

它顯示了8行,來自AlbumID 10的其中一行和13以及在Details的所有字段中都帶有「YES」。雖然它應該顯示輸出完全符合我在部分實際問題中顯示的方式。 – Learning 2012-07-23 10:02:10

+0

我嚇壞了這個查詢數據似乎是正確的,我必須在某個地方做錯什麼...... – Learning 2012-07-23 10:03:55

0

左外連接PhotoMappings應該是工作之前:

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 
+0

我以前試過類似的查詢,但結果保持不變。我試過你的查詢,它也只是顯示了第6行'期望的輸出',因爲我在實際問題的一部分中顯示 – Learning 2012-07-23 09:48:14