2016-07-04 12 views
0

すべて私のデータベースに登録されたのアカウントは、自分の「プロフィール」画像と「カバー」画像(facebookスタイル)の画像ファイルパスで登録されています。イメージファイルパスは、別のテーブルのaccountテーブルに格納されます。異なるテーブルの複数の行を1つの行に結合するにはどうすればよいですか?

SELECT 
    a1.AccountID, 
a1.Forename, 
    a1.Surname, 
    img1.Filename AS ProfileImg, 
    img2.Filename AS CoverImg 
FROM 
    dbo.Account a1 
LEFT JOIN 
    dbo.AccountImage img1 ON --table with images in 
    img1.AccountID = a1.AccountID AND ProfileImg = 1 --boolean column to mark it as profile pic 
LEFT JOIN 
    dbo.AccountImage img2 ON --table with images in 
    img2.AccountID = a1.AccountID and CoverImg = 1 --boolean column to flag as cover pic 

アカウントテーブル:

AccountID | Forename | Surname | 
12345  | Ben  | Hur  | 
12346  | Frodo | Baggins | 
12349  | Bill  | Gates | 

AccountImageテーブル:

AccountID | Filename  | ProfileImg | CoverImg 
12345  | face.jpg  | True  | NULL 
12345  | bg.jpg  | NULL  | True 
12346  | graph.png | NULL  | NULL 
12349  | sunset.jpg | NULL  | True 

これは、現在返されます

|AccountID|Forename|Surname|ProfileImg|CoverImg | 
| 12345|  Ben| Hur|NULL  |bg.jpg | 
| 12345|  Ben| Hur|face.jpg |NULL  | 
012を

私のコードは次のようです

結果、私はちょうど、それぞれ自分のアカウントの詳細と画像のパスの両方を含む各AccountIDのための単一の行を返したい

|AccountID|Forename|Surname|ProfileImg|CoverImg | 
| 12345|  Ben| Hur|face.jpg |bg.jpg | 

を必要とする(アカウントの何百もあります)。そうでなければ、私は重複した行に終わります - 一つはProfileImgファイルパスを含み、もう一つはCoverImgファイルパスを含みます。

ちょうど注意してください - プロフィールやカバー写真がない可能性があります。どちらの列もNULLになることを意味します。

+1

MAX(img1.Filename)、MAX(img2.Filename)、グループ化してもらえますか? – Veljko89

+0

動作するかどうかわかりませんが、 'GROUP BY'を試しましたか? –

+1

AccountID、Forenameと姓が同じであれば、グループ作業は – Veljko89

答えて

2

この

SELECT 
    a1.AccountID, 
a1.Forename, 
    a1.Surname, 
    max(img1.Filename) AS ProfileImg, 
    max(img2.Filename) AS CoverImg 
FROM 
    dbo.Account a1 
LEFT JOIN 
    dbo.AccountImage img1 ON --table with images in 
    img1.AccountID = a1.AccountID AND ProfileImg = 1 --boolean column to mark it as profile pic 
LEFT JOIN 
    dbo.AccountImage img2 ON --table with images in 
    img2.AccountID = a1.AccountID and CoverImg = 2 
GROUP BY 
a1.AccountID, 
a1.Forename, 
    a1.Surname 
+0

非常にうまく働いてくれてありがとう。:)私が更新した元のコードには誤字があります。ブール値フィールドであるため、 'CoverImg = 1'にする必要があります。 –

0

ただ、uは、内部使用する必要があり、参加の代わりに、左の試しはここ

SELECT 
    a1.AccountID, 
    a1.Forename, 
    a1.Surname, 
    img1.Filename AS ProfileImg, 
    img2.Filename AS CoverImg 
FROM 
    dbo.Account a1 
INNER JOIN 
    dbo.AccountImage img1 ON 
    img1.AccountID = a1.AccountID AND ProfileImg = 1 
INNER JOIN 
    dbo.AccountImage img2 ON 
    img2.AccountID = a1.AccountID and CoverImg = 2 
+0

内部結合が機能しません申し訳ありません。 –

0

に参加し、それを行うだろう図です。特定のアカウントに複数の種類のイメージがセットアップされないように、アカウントイメージテーブルに一意のインデックスを設定する必要があります。

SELECT AccountID, Forename, Surname, 
(SELECT TOP (1) Filename 
FROM dbo.AccountImage 
WHERE (AccountID = dbo.Account.AccountID) AND (ProfileImg <> 0)) AS ProfileImg, 
(SELECT TOP (1) Filename 
FROM dbo.AccountImage AS AccountImage_2 
WHERE (AccountID = dbo.Account.AccountID) AND (CoverImg <> 0)) AS CoverImg 
FROM dbo.Account 
WHERE ((SELECT COUNT(*) AS Expr1 
FROM dbo.AccountImage AS AccountImage_1 
WHERE (AccountID = dbo.Account.AccountID) AND (ProfileImg <> 0) OR 
(AccountID = dbo.Account.AccountID) AND (CoverImg <> 0)) = 2) 
関連する問題