产品标签关系的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

JOINing多对多表时避免SQL查询中的重复行

Apex Oracle 中的 SQL 多对多查询

查询相关产品

什么是瓶盖防伪码标签,全国315产品防伪查询中心

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

WooCommerce 按标签或描述搜索产品查询帖子