我有一個產品表,每個產品可以有多個標簽,產品可以通過這些標簽進行過濾。
我正在嘗試根據活動過濾器獲取標簽串列。
產品
---- -----------
| id | name |
---- -----------
| 1 | Product 1 |
| 2 | Product 2 |
| 3 | Product 3 |
---- -----------
標簽
---- -----------
| id | name |
---- -----------
| 1 | Tag1 |
| 2 | Tag 2 |
| 3 | Tag 3 |
---- -----------
產品標簽
----------- -------
| productId | tagId |
----------- -------
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
----------- -------
我想得到的標簽結果表如下所示:
| ID | 姓名 | 產品數量 |
|---|---|---|
| 1 | 標簽1 | 3 |
| 2 | 標簽2 | 0 |
| 3 | 標簽3 | 1 |
uj5u.com熱心網友回復:
你可以使用這個查詢
SET ANSI_WARNINGS OFF;
CREATE TABLE tag (
id int identity(1,1),
tagname varchar(100),
)
CREATE TABLE product (
id int identity(1,1),
productName varchar(100),
)
CREATE TABLE pt (
pid int null,
tid int null,
)
insert product
values('A')
insert product
values('B')
insert tag
values('Aa')
insert tag
values('Bb')
insert pt
values(1,1)
insert pt
values(1,1)
select tag.tagname,
count(pt.pid)productcount
from tag
left join
pt on pt.tid=tag.id
group by
tag.tagname
所以結果是:

如果在 SET ANSI_WARNINGS OFF 后有錯誤;使用 Go
對于 show row as id 你可以使用這個查詢
select
ROW_NUMBER() OVER(ORDER BY tag.tagname) AS id
,
tag.tagname,
count(pt.pid)productcount
from tag
left join
pt on pt.tid=tag.id
group by
tag.tagname
所以結果是

uj5u.com熱心網友回復:
所以我想出了這個似乎作業正常的查詢。
它根據標簽過濾器獲取標簽。如果產品由 Tag1 和 Tag2 過濾,我將獲得所有標簽以及如果我按每個標簽過濾將保留的產品數量。
SELECT
t.id,
t.name,
(
SELECT COUNT(*) from (
SELECT
pt.productId
FROM productTags pt
INNER JOIN productTags pt2
ON pt2.productId = pt.productId
AND pt2.tagId IN (1,2)
WHERE pt.tagId = t.id
GROUP BY pt.productId
HAVING COUNT(DISTINCT pt2.tagId) = 2
) AS count
) AS count
FROM tags t
uj5u.com熱心網友回復:
嘗試這個:
SELECT t.id, t.Name, COUNT(DISTINCT pt.productId) as productCount
FROM Tags t
LEFT JOIN ProductTags pt on pt.tagId = t.id
GROUP BY t.id, t.Name
或者使用過濾器:
SELECT t.id, t.Name, COUNT(DISTINCT pt.productId) as productCount
FROM Tags t
LEFT JOIN ProductTags pt on pt.tagId = t.id
WHERE t.id IN (1,2)
GROUP BY t.id, t.Name
或者使用過濾器,但仍顯示所有標簽:
SELECT t.id, t.Name, COALESCE(pc.productCount,0) as productCount
FROM Tags t
LEFT JOIN (
SELECT pt.tagId, COUNT(DISTINCT pt.productId) as productCount
FROM ProductTags pt
WHERE pt.tagId IN (1,2)
GROUP BY pt.tagId
) pc ON t.id = pc.tagId
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374185.html
標籤:sql sql-server 查询语句
