繁体   English   中英

我该如何编写这个3级深度mysql查询?

[英]How would I write this 3 level deep mysql query?

这可能有点难以解释,但我会尝试。

我想显示一个类别列表(存储在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时。

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')
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

像这样的东西?

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;

首先选择具有记录的域 - 然后引入与域匹配的类别。

所以像

 SELECT * FROM records 
    INNER JOIN domains on <clause> 
    INNER JOIN categories on <clause>
 WHERE <something>

我无法解释这一点,但是在编写SQL时经常会很容易从select中我们想要的字段列表中查看事物,并倾向于使用它来指示我们使用表来构建数据的方式。 实际上,我们应该更多地关注数据如何与我们正在构建的查询相关(这通常看起来像前面那样)。

扩展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

等等...

(虽未测试)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM