SQL Query用于检索带有帖子的标签

时间:2011-06-19 06:39:14

标签: asp.net sql tsql

所以我有一个SQL表结构,所以我有

  1. 有blogIDs的博客
  2. 在BlogID上加入博客的BlogAffiliates [获取人员关联 与博客]
  3. 与BlogID上的博客加入的BlogPost [获取博客的所有帖子]
  4. 在BlogPostID上与BlogPosts连接的BlogPostPictures [获取给定博客的所有帖子的图片]
  5. 所以我提供了一个与BlogAffiliates匹配的用户名,它应该能够获得与该用户相关联的所有BlogID,这反过来又会让我获得所有博客,这反过来又会让我收到所有博客文章,这反过来又会让我获得所有博客文章。

    这很好用。我的问题是BlogPosts也有BlogPostTags,它使用BlogPostID匹配BlogPostTags表。

    我有以下查询

        select * from BlogPosts,BlogAffiliates, Blogs, BlogPostPictures
          where BlogAffiliates.UserID = @UserID 
          and BlogPosts.BlogID = BlogAffiliates.BlogID
          and Blogs.BlogID = BlogAffiliates.BlogID and 
          BlogPosts.BlogPostID = BlogPostPictures.BlogPostID
    

    这将为我提供一行数据,包括我为给定用户提供的每篇博文所需的所有信息。我如何在此包含标签?问题是我为每个BlogPost都有很多BlogPostTags所以我不知道如何加入或分组这个信息? BlogPostTags有一个可以与BlogPosts连接的BlogPotID。我是否需要为包含该标签的每个标签返回一次EACH行的副本?这似乎是一个数据爆炸,而现在10个BlogPosts将返回10行,如果他们每个有5个BlogPostTags将是50行?我是不是很好地构建了我的表格,或者我错过了将标签聚合到每一行的某些方法[我甚至不关心它们是否聚合成1个字段并且我将它们分隔开来或者在查询的另一端解码它]

    提前致谢!

    任何想法???

1 个答案:

答案 0 :(得分:2)

好吧,这取决于你想要对数据做什么。

你的桌子结构很好。

如果您想要返回当前相同数量的行 - 即每个博文站每个联盟会员1个(假设每个博客帖子每个图片1个?)那么您需要将标签打包到结果集中的单个列中。

或者您只需在代码中管理完整的结果集:

例如,您可以拥有一个BlogPost对象,其中包含一组标签 - 一个ORM可以轻松地为您处理这个问题 - 或者使用带有循环的数据加载器并迭代建立标签集合,移动到下一个记录时博客改变。

在SQL中 - 你可以编写一个UDF来执行相同的功能。

CREATE FUNCTION [dbo].[GetTagsByBlogPostId] (
@BlogPostID int
)
RETURNS varchar(max)
AS
DECLARE @Tags @OUTPUT varchar(max)
SELECT @Tags = COALESCE(@Tags + ', ', '') + Tag
FROM BlogPostTags
where BlogPostId = @BlogPostId

RETURN @Tags END

然后在上面的SQL语句中,只需将对UDF的调用附加到SELECT语句:

 select * from BlogPosts,BlogAffiliates, Blogs, BlogPostPictures, dbo.GetTagsByBlogPostId(BlogPosts.BlogPostId)
  where BlogAffiliates.UserID = @UserID 
  and BlogPosts.BlogID = BlogAffiliates.BlogID
  and Blogs.BlogID = BlogAffiliates.BlogID and 
  BlogPosts.BlogPostID = BlogPostPictures.BlogPostID