各ポータルから1行 (日付ごとの最後の行)だけを選択しようとしていますが、group by/distinct で問題が発生しています
このコードを使用すると、必要な portalId のみを選択できますが、データはありません
Select relNews.PortalId
from news
left join relNews on relNews.NewsId= news.NewsId
group by relNews.PortalId
このコードのように 1 つまたは複数のデータ列を追加すると、選択により、ポータルごとに 1 つだけでなく、すべての情報が表示されます
Select relNews.PortalId, news.NewsId
from news
left join relNews on relNews.NewsId= news.NewsId
group by relNews.PortalId, news.NewsId
それは私がここで見逃している小さなトリックであることは知っていますが、何が思い出せないのですか...
アップデート
この例の仮想テーブルを作成しましょう。表は(ここnews
でrelNews
はできるだけ短くしました)
テーブルニュース
- ニュースID
- 題名
- 説明
- 日にち
テーブル relNews
- RelNewsId
- ニュースID
- ポータル ID
ノート:
- relNews は
N
同じ NewsId のレジスタを持つことができます - (news.Date に基づいて) portalId ごとに最後の登録を選択する必要があります。
まあ言ってみれば:
テーブルニュース
- ニュース ID == 1
- タイトル == 'テスト'
- 説明 == 'テスト'
日付 == '2013-01-01 00:00:00'
ニュース ID == 2
- タイトル == 'test2'
- 説明 == 'test2'
日付 == '2013-01-01 03:00:00'
ニュース ID == 3
- タイトル == 'test3'
- 説明 == 'test3'
- 日付 == '2013-01-02 00:00:00'
テーブル relNews
- RelNewsId == 1
- ニュース ID == 1
ポータル ID == 1
RelNewsId == 2
- ニュース ID == 1
ポータル ID == 2
RelNewsId == 3
- ニュース ID == 2
ポータル ID == 1
RelNewsId == 4
- ニュース ID == 3
- ポータル ID == 3
このデータは次のことをもたらすはずです。
RelNewsId == 2 ; RelNewsId == 3 ; RelNewsId == 4 ;
このコードで必要な結果を得ることができます:
Select top 1 relNews.PortalId, news.NewsId, news.date
from news
left join relNews on relNews.NewsId= news.NewsId
where relNews.PortalId == 1
group by relNews.PortalId, news.NewsId
order by news.date desc
UNION
Select top 1 relNews.PortalId, news.NewsId, news.date
from news
left join relNews on relNews.NewsId= news.NewsId
where relNews.PortalId == 2
group by relNews.PortalId, news.NewsId
order by news.date desc
UNION
Select top 1 relNews.PortalId, news.NewsId, news.date
from news
left join relNews on relNews.NewsId= news.NewsId
where relNews.PortalId == 3
group by relNews.PortalId, news.NewsId
order by news.date desc
次に、3つの結果すべてを取得します。