所以我有一个SQL表结构,所以我有
所以我提供了一个与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个字段并且我将它们分隔开来或者在查询的另一端解码它]
提前致谢!
任何想法???
答案 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