这可能有点难以解释,但我会尝试。
我想显示一个类别列表(存储在1个表中),以及与每个类别相关联的域数(存储在另一个表中)。
在这种情况下,猴子扳手是每个域都有一组与之关联的记录(存储在第3个表中)。我只想显示具有与之关联的域的类别,域的数量应仅反映具有与之关联的记录的域(来自第3个表)。
我当前的查询
SELECT r.rev_id, c.cat_id, c.cat_name, count(d.dom_id) As rev_id_count FROM reviews r
INNER JOIN domains d ON r.rev_domain_from=d.dom_id
INNER JOIN categories c ON d.dom_catid=c.cat_id
WHERE rev_status = 1
GROUP BY cat_name
ORDER BY cat_name
这会选择正确的类别名称,但会显示错误计数(rev_id_count)。如果该类别中包含2个域,并且每个域有2个记录,则它应显示为4,当它应为2时。
答案 0 :(得分:3)
SELECT Categories.Name,count(DISTINCT categories.name) FROM Categories
JOIN Domains ON Categories.ID=Domains.CID
JOIN Records ON Records.DID=Domains.ID
GROUP BY Categories.Name
使用以下设置进行测试:
CREATE TABLE Categories (Name nvarchar(50), ID int NOT NULL IDENTITY(1,1))
CREATE TABLE Domains (Name nvarchar(50), ID int NOT NULL IDENTITY(1,1), CID int)
CREATE TABLE Records (Name nvarchar(50), ID int NOT NULL IDENTITY(1,1), DID int)
INSERT INTO Records (DID) VALUES (1)
INSERT INTO Records (DID) VALUES (1)
INSERT INTO Records (DID) VALUES (2)
INSERT INTO Records (DID) VALUES (2)
INSERT INTO Records (DID) VALUES (3)
INSERT INTO Records (DID) VALUES (3)
INSERT INTO Domains (Name,CID) VALUES ('D1',1)
INSERT INTO Domains (Name,CID) VALUES ('D2',1)
INSERT INTO Domains (Name,CID) VALUES ('D5',1)
INSERT INTO Domains (Name,CID) VALUES ('D3',2)
INSERT INTO Domains (Name,CID) VALUES ('D4',2)
INSERT INTO Categories (Name) VALUES ('1')
INSERT INTO Categories (Name) VALUES ('2')
INSERT INTO Categories (Name) VALUES ('3')
答案 1 :(得分:2)
select c.name, count(distinct d.did) from domains d
left join categories c on c.cid = d.cid
left join records r on r.did = d.did
group by c.name
测试了2个类别,每个类别2个域,每个域的随机记录数。结果集:
name count
---- -----
test 2
test2 2
答案 2 :(得分:0)
这样的东西?
SELECT c.name, count(d.id)
FROM categories c
JOIN domains d ON c.id = d.cid
JOIN records r ON r.did = d.id
GROUP BY c.name;
答案 3 :(得分:0)
首先选择包含记录的域 - 然后引入与域匹配的类别。
类似
SELECT * FROM records
INNER JOIN domains on <clause>
INNER JOIN categories on <clause>
WHERE <something>
我无法解释这一点,但是在编写SQL时经常会很容易从select中我们想要的字段列表中查看内容,并倾向于使用它来指示我们使用表格的方式建立数据。实际上,我们应该更多地关注数据如何与我们正在构建的查询相关联(通常看起来像往前一样)。
答案 4 :(得分:0)
扩展AquilaX的解决方案,您只需选择域名:
SELECT c.name, d.name, count(d.id)
FROM categories c
JOIN domains d ON c.id = d.cid
JOIN records r ON r.did = d.id
GROUP BY c.name, d.name;
哪个应该显示:
Cat 1, Domain 1, 2
Cat 1, Domain 2, 1
Cat 2, Domain 3, 5
等...
(未经测试)