0

写真サブテーブルを持つ投稿テーブルがあるため、1 つの投稿に多くの写真を含めることができます。写真テーブルの列の 1 つは [優先度] です。

別のテーブルで最優先の写真のみを含むレコードを投稿テーブルから選択する必要があります。

したがって、結果は次のようになります。

Photo  Post
pic1   Article1
picX   Article2

現在、私の結果は次のように表示されます

Photo  Post
pic1   Article1
pic2   Article1
picX   Article2

このクエリで:

 SELECT  [Photo], 
         [PostTitle]
 FROM [Post] sp
 INNER JOIN [PostPhotos] spp
 ON (sp.AutoId = spp.PostId)
 WHERE sp.[AutoId] IN (SELECT [PostID] 
                       FROM [Favorites] 
                       WHERE [UserId] = 'UserXXX')

結合クエリを試しましたが成功しませんでした:

 SELECT photo, 
        [PostTitle],
        [AskingPrice]
 FROM (SELECT sp.[AutoId], 
              [PostTitle] 
       FROM [SellPost] sp
       WHERE sp.[AutoId] IN (SELECT [PostID] 
                             FROM [Favorites] 
                             WHERE [UserId] = 'UserId') )a
 full OUTER JOIN(SELECT TOP 1 [PostId], 
                        [photo] 
                 FROM [PostPhotos] spp 
                 WHERE PostId IN (SELECT [PostID] 
                                  FROM [Favorites] 
                                  WHERE [UserId] = 'UserXXX') 
                 ORDER BY [Priority] ASC )b
  on (a.AutoId = b.PostId)
  order by a.AutoId; 

マイ テーブル:

Table Post
PostId, PostTitle

Table PostPhotos
AutoId, PostId, Photo, Priority --> 1 post can have many photos

誰か親切に助けてください。ありがとう。

4

5 に答える 5

0

あなたの説明からは、いくつかのことが不明です( とAutoIdは 、主キーはPostPhotos何ですか、何をFavoritesしていますか / そのテーブルはどのように見えますか)。しかし、一般的な考え方は次のとおりです。

WITH RankedPhotos AS (
  SELECT
    PostId,
    AutoId, -- I'm assuming this is the primary key of PostPhotos?
    RANK() OVER (PARTITION BY AutoId, PostId ORDER BY Priority ASC) AS PhotoRank
  FROM
    Post p JOIN
    PostPhotos pp ON
      p.PostId = pp.PostId
), TopPhotos AS (
  SELECT
    PostId,
    AutoId
  FROM
    RankedPhotos
  WHERE
    PhotoRank = 1
)
SELECT
  PostTitle,
  Photo
FROM
  RankedPhotos r JOIN
  Post p ON
    r.PostId = p.PostId JOIN
  PostPhotos pp ON
    r.AutoId = p.AutoId

もちろん、CTE をアンラップして、ネストされたサブクエリを使用することもできます (おそらく完全に削除することもできますTopPhotos) が、これはおそらく見たり理解したりするのが簡単です。

基本的な考え方は次のとおりです。

  • では、すべての/ペアRankedPhotosを「ランク付け」しますPostPostPhoto
  • TopPhotosID をフィルター処理して、ランクが最も高い ID に絞り込みます。
  • 元のテーブルに結合して、実際に必要なレコードを取得します

明らかに、追加する必要がある他の基準 (ユーザーなど) でフィルタリングする必要がある場合。プロセスのできるだけ早い段階 (つまりRankedPhotos) に追加するのが最善です。そうしないと、データベースが必要以上の作業を行うことになる可能性があります。

于 2013-04-26T04:55:39.383 に答える