左加入MySQL中的Will Null



我正在寻找一种在两个(或更多)不同表中寻找值时创建相对相关功能的方法。所以我有这样的桌子

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

您可以将工会全部用于您想要的桌子数量,也不会对性能产生重大影响。

相关内容

  • 没有找到相关文章

最新更新