我正在寻找一种在两个(或更多)不同表中寻找值时创建相对相关功能的方法。所以我有这样的桌子
table1:
id weight
1 0.1
2 0.15
3 0.12
6 0.21
table2:
id weight
3 0.09
6 0.2
8 0.1
11 0.13
我需要通过合并这两个表从这两个表获得相关功能。同一行ID将获得10倍的相关性,并且只有一个表格的ID行将获得"权重"相关性。
这是我需要得到的中间表(我的问题是如何制作这样的表):
id1 weight1 id2 weight2
1 0.1 null null
2 0.15 null null
3 0.12 3 0.09
6 0.21 6 0.2
null null 8 0.1
null null 11 0.13
使用此表,我可以按照我需要计算相关性,但是问题是从这两个中创建此类表。你能帮我吗?
我尝试使用左连接,aright_join,左外连接,但它们的结果非常不同。
编辑:如果重要的话,我目前设想最后表格看起来像这样:
id relevance
1 0.1
2 0.15
3 2.1
6 4.1
8 0.1
11 0.13
您可以使用FULL OUTER JOIN
,例如:
SELECT t1.id AS id1, t1.weight AS weight1, t2.id AS id2, t2.weight AS weight2
FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT t1.id AS id1, t1.weight AS weight1, t2.id AS id2, t2.weight AS weight2
FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id = t2.id;
以下是一些示例:
create table Table1 ( id int primary key not null, weight decimal(10,2) not null default 0 );
create table Table2 ( id int primary key not null, weight decimal(10,2) not null default 0 );
insert into Table1 (id, weight) values (1, 0.10) ,(2, 0.15) ,(3, 0.12) ,(6, 0.21) ;
insert into Table2 (id, weight) values (3, 0.09) ,(6, 0.20) ,(8, 0.10) ,(11, 0.13) ;
select id12.id as id, t1.id as id1, t1.weight as weight1, t2.id as id2, t2.weight as weight2 from (select id from Table1 union select id from Table2) id12 left join Table1 t1 on t1.id = id12.id left join Table2 t2 on t2.id = id12.id ;
id |ID1 |重量1 |ID2 |重量2 - :|---:|------:|---:|------:: 1 |1 |0.10 | null | null 2 |2 |0.15 | null | null 3 |3 |0.12 |3 |0.09 6 |6 |0.21 |6 |0.20 8 | null | null |8 |0.1011 | null | null |11 |0.13
select id12.id as id, coalesce(t1.weight,0) + coalesce(t2.weight,0) as relevance from (select id from Table1 union select id from Table2) id12 left join Table1 t1 on t1.id = id12.id left join Table2 t2 on t2.id = id12.id order by id12.id;
id |关联 - :|---------:: 1 |0.10 2 |0.15 3 |0.21 6 |0.41 8 |0.1011 |0.13
select id, sum(weight) as relevance from ( select id, weight from Table1 union all select id, weight from Table2 ) q group by id order by id;
id |关联 - :|---------:: 1 |0.10 2 |0.15 3 |0.21 6 |0.41 8 |0.1011 |0.13
db<>小提琴
第二&第三查询返回相同的结果。
哪个更好?
这取决于需要多少个额外的字段和/或额外的计算。
SELECT id
, SUM(weight) * CASE WHEN COUNT(*)=1 THEN 1 ELSE 10 END relevance
FROM
( SELECT id
, weight
FROM table1
UNION
ALL
SELECT id
, weight
FROM table2
) x
GROUP
BY id;
+----+-----------+
| id | relevance |
+----+-----------+
| 1 | 0.10 |
| 2 | 0.15 |
| 3 | 2.10 |
| 6 | 4.10 |
| 8 | 0.10 |
| 11 | 0.13 |
+----+-----------+
我们可以使用存储过程和临时表获取解决方案
CREATE PROCEDURE GetReleavance()
BEGIN
Create TEMPORARY TABLE tmpList ENGINE=MEMORY
SELECT id, weight from t1
union all
SELECT id, weight from t2
union all
SELECT id, weight from t3;
select id, sum(weight)* POW(10,COUNT(1)-1) as relevance
from tmpList
group by id;
DROP TEMPORARY TABLE IF EXISTS tmpList;
END
在过程中创建一个临时表,并从不同的表中使用所有ID和权重,并根据ID获取总和(werge)。
使用
调用存储过程CALL GetReleavance()
您可以将工会全部用于您想要的桌子数量,也不会对性能产生重大影响。