产品标签关系的 SQL 查询
Posted
技术标签:
【中文标题】产品标签关系的 SQL 查询【英文标题】:SQL Query for Product-Tag relationship 【发布时间】:2008-12-23 11:44:20 【问题描述】:我有一个电子商务店面的数据库。 MSSQL 2008。
我有一个名为 Products 的表和一个名为 Tags 的表。这是一个多对多关系,由名为 ProductTags 的表绑定在一起。
产品: ID、名称、价格
标签: id、name、sortorder、parentid(允许为空)
产品标签: 产品编号,标签编号
我正在尝试在 SQL 中创建视图,但我完全不擅长编写 SQL。
视图应包括: Tags.id、Tags.Name、Tags.sortorder、Tags.parentid、ProductCount、ChildTagCount
ProductCount 是与此标签关联的产品数量。 ChildTagCount 是以该 Tag 的 id 作为其 parentid 的 Tag 的数量。
【问题讨论】:
【参考方案1】:SELECT Tags.ID, Tags.Name, Tags.SortOrder, Tags.ParentID,
COUNT(DISTINCT ProductTags.ProductID) AS ProductCount,
COUNT(DISTINCT ChildTags.ID) AS ChildTagCount
FROM Tags
LEFT OUTER JOIN ProductTags ON Tags.ID = ProductTags.TagID
LEFT OUTER JOIN Tags ChildTags ON Tags.ID = ChildTags.ParentID
GROUP BY Tags.ID, Tags.Name, Tags.SortOrder, Tags.ParentID
【讨论】:
您为什么选择从连接表 (producttags) 中计算 productid 只是因为从连接表中计算不同的值可能不会给出正确的结果,因为产品可以有很多标签,反之亦然。请帮忙。谢谢【参考方案2】:Select T.id, T.Name, T.sortorder, T.parentid,
(select count(*) from productstags where tagid=T.TagId) as ProductCount,
(select count(*) from Tags where parentid=T.TagId) as ChildTagCount
from Tags T
这行得通吗?
【讨论】:
【参考方案3】:这两个建议都有效。它们中的任何一个是否有任何性能上的好处/痛苦?
说实话。我自己创建的视图与 devio 的完全相同 - 只是我忘记了两个 COUNT 中的 DISTINCT - 看到值爆炸了!
【讨论】:
以上是关于产品标签关系的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章