Mysql Sql连接两个表,并基于另一列及其累积计数映射公共值
我有下面两张桌子 表1:Mysql Sql连接两个表,并基于另一列及其累积计数映射公共值,mysql,sql,Mysql,Sql,我有下面两张桌子 表1: id document -------------- A2 B200 A2 B6 A2 B2 A2 B3 A3 B2 A3 B400 A5 B100 A5 B500 A6 B6 A7 B200 A8 B6 A8 B2 A8 B3
id document
--------------
A2 B200
A2 B6
A2 B2
A2 B3
A3 B2
A3 B400
A5 B100
A5 B500
A6 B6
A7 B200
A8 B6
A8 B2
A8 B3
A8 C1
表2:
id name
--------------
A1 Jack
A2 Martin
A3 Jack
A4 Thomas
A5 Jack
A6 Thomas
A7 Thomas
A8 John
A9 John
A10 Kate
我的筛选器如下所示,它应该比较文档
列和基于此列表的筛选器:
WHERE table1.document IN (B2,B400,B100,B500,B200,B6,B2,B3)
结果应如下所示:
name1 name2 freq
--------------------
Jack John 1
Martin Jack 1
Martin Thomas 2
Martin John 3
Thomas John 1
一些解释:我们需要建立一个结果表,映射具有共同
文档的名称
s及其频率。首先,我们需要使用WHERE IN
语句过滤文档列表,以获得要映射的文档列表
然后我们得到计数不止一个的文档列表,因为该文档在至少两个ID之间共享
然后,我们在表2中查找这些ID的名称
s,并将它们放入结果表和它们共同拥有的文档计数中。有些名称有多个ID,因此如果我们点击这些ID,我们会将其添加到计数中
例如,文档B6被分配给A2和A6的ID,因此它们有共同的文档,我们在结果表中创建一个条目,
将它们对应的名称分别命名为name1和name2(顺序无关紧要),并将其频率设置为1。但如果我们进一步看,我们会发现
文档B200由A2和A7共享,当我们查找这两个ID的名称时,我们看到已经有了一个带有这些名称的条目,因为
他们对马丁和托马斯的计数和前一个一样,所以我们加上他们的计数,它变成了2
另一个例子是A2和A8、Martin和John共享的文档B6、B2、B3,所以我们为这两个创建一个条目,然后计数
将是3。
这里有一个数据。您必须执行两次连接,然后按两个名称分组:
SELECT t2a.name, t2b.name, COUNT(*)
FROM Table1 t1a
INNER JOIN Table2 t2a ON t2a.id = t1a.id
INNER JOIN Table1 t1b ON t1b.document = t1a.document
INNER JOIN Table2 t2b ON t2b.id = t1b.id AND t2a.name < t2b.name
GROUP BY t2a.name, t2b.name
选择t2a.name、t2b.name、COUNT(*)
来自表1 t1a
t2a.id=t1a.id上的内部联接表2 t2a
t1b.document=t1a.document上的内部联接表1 t1b
t2b.id=t1b.id和t2a.name
您必须执行两次联接,然后按两个名称分组:
SELECT t2a.name, t2b.name, COUNT(*)
FROM Table1 t1a
INNER JOIN Table2 t2a ON t2a.id = t1a.id
INNER JOIN Table1 t1b ON t1b.document = t1a.document
INNER JOIN Table2 t2b ON t2b.id = t1b.id AND t2a.name < t2b.name
GROUP BY t2a.name, t2b.name
选择t2a.name、t2b.name、COUNT(*)
来自表1 t1a
t2a.id=t1a.id上的内部联接表2 t2a
t1b.document=t1a.document上的内部联接表1 t1b
t2b.id=t1b.id和t2a.name
你喜欢这样吗
CREATE TABLE Table1
(id varchar(10), document varchar(10))
INSERT INTO Table1
VALUES
('A2', 'B200'),
('A2', 'B6'),
('A2', 'B2'),
('A2', 'B3'),
('A3', 'B2'),
('A3', 'B400'),
('A5', 'B100'),
('A5', 'B500'),
('A6', 'B6'),
('A7', 'B200'),
('A8', 'B6'),
('A8', 'B2'),
('A8', 'B3'),
('A8', 'C1')
CREATE TABLE Table2
(id varchar(3), name varchar(10))
INSERT INTO Table2
VALUES
('A1', 'Jack'),
('A2', 'Martin'),
('A3', 'Jack'),
('A4', 'Thomas'),
('A5', 'Jack'),
('A6', 'Thomas'),
('A7', 'Thomas'),
('A8', 'John'),
('A9', 'John'),
('A10','Kate')
;WITH docs AS (
SELECT id, document FROM Table1
WHERE table1.document IN ('B2','B400','B100','B500','B200','B6','B2','B3')
)
, user_docs AS (
SELECT t2.id, t2.name, docs.document FROM docs
INNER JOIN Table2 t2 ON t2.id = docs.id
)
, freq AS (
SELECT ud.name, ud1.name name1, count(*) freq FROM user_docs ud
INNER JOIN user_docs ud1 ON ud1.document = ud.document AND ud1.name != ud.name AND ud1.id > ud.id
GROUP BY ud.name, ud1.name
)
SELECT * FROM freq
DROP TABLE Table1, Table2
你喜欢这样吗
CREATE TABLE Table1
(id varchar(10), document varchar(10))
INSERT INTO Table1
VALUES
('A2', 'B200'),
('A2', 'B6'),
('A2', 'B2'),
('A2', 'B3'),
('A3', 'B2'),
('A3', 'B400'),
('A5', 'B100'),
('A5', 'B500'),
('A6', 'B6'),
('A7', 'B200'),
('A8', 'B6'),
('A8', 'B2'),
('A8', 'B3'),
('A8', 'C1')
CREATE TABLE Table2
(id varchar(3), name varchar(10))
INSERT INTO Table2
VALUES
('A1', 'Jack'),
('A2', 'Martin'),
('A3', 'Jack'),
('A4', 'Thomas'),
('A5', 'Jack'),
('A6', 'Thomas'),
('A7', 'Thomas'),
('A8', 'John'),
('A9', 'John'),
('A10','Kate')
;WITH docs AS (
SELECT id, document FROM Table1
WHERE table1.document IN ('B2','B400','B100','B500','B200','B6','B2','B3')
)
, user_docs AS (
SELECT t2.id, t2.name, docs.document FROM docs
INNER JOIN Table2 t2 ON t2.id = docs.id
)
, freq AS (
SELECT ud.name, ud1.name name1, count(*) freq FROM user_docs ud
INNER JOIN user_docs ud1 ON ud1.document = ud.document AND ud1.name != ud.name AND ud1.id > ud.id
GROUP BY ud.name, ud1.name
)
SELECT * FROM freq
DROP TABLE Table1, Table2
名称1和名称2列。。。这是否意味着你可能有名字3..n?或者这一列的名称分隔符是分开的?@Stephen将只有两列,唯一的行,它们具有唯一的名称组合,您将永远不会看到THOMAS JOHN两次,如果是这样,那么我们需要添加到其现有计数,而不是添加新行。name1和name2列。。。这是否意味着你可能有名字3..n?或者这一列的名称分隔符是分开的?@Stephen只有两列,唯一的行,它们有唯一的名称组合,你永远不会看到THOMAS JOHN两次,如果是这样,那么我们需要添加到它们现有的计数,而不是添加新行。这是一个MySQL问题。不,我的错,我没注意到。虽然如果有人需要用MSSQL解决相同类型的问题,他可以使用此解决方案;)这是一个问题。不,我的错,我没注意到。虽然如果有人需要用MSSQL解决相同类型的问题,他可以使用此解决方案;)确切地说,获取所有可能的name
值对的关键是t2b.id=t1b.id和t2a.name
上Table2的自连接。确切地说,获取所有可能的name
值对的关键是t2b.id=t1b.id和t2a.name