Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Sql连接两个表,并基于另一列及其累积计数映射公共值_Mysql_Sql - Fatal编程技术网

Mysql Sql连接两个表,并基于另一列及其累积计数映射公共值

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

我有下面两张桌子

表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    
    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