左联接将在 MySQL 中为空
Left join will null in MySQL
我正在寻找一种在两个(或更多)不同 table 中查找值时创建相对相关函数的方法。所以我有 table 个这样的
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
我需要通过合并这两个 table 来获得相关函数。相同的行 ID 将获得 10 倍的相关性,ID 仅来自一个 table 的行将获得 "weight" 相关性。
这是我需要得到的中间 table(我的问题是如何制作这样的 table):
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
使用这个table我可以计算任何我需要的相关性,但问题是从这两个创建这样的table。你能帮帮我吗?
我尝试了 LEFT JOIN、STRAIGHT_JOIN、LEFT OUTER JOIN,但它们的结果截然不同。
编辑:如果重要的话,我目前设想最终 table 看起来像这样:
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;
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 |
+----+-----------+
我们可以使用存储过程和临时 tables 来获得解决方案
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
在创建临时 table 的过程中,所有 ID 和权重都来自不同的 table,并根据 ID 获取总和(权重)。
调用存储过程使用
CALL GetReleavance()
您可以根据需要为 table 的数量创建 Union all,它不会对性能产生重大影响。
这里有几个例子:
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 | weight1 | id2 | weight2
-: | ---: | ------: | ---: | ------:
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.10
11 | 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 | relevance
-: | --------:
1 | 0.10
2 | 0.15
3 | 0.21
6 | 0.41
8 | 0.10
11 | 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 | relevance
-: | --------:
1 | 0.10
2 | 0.15
3 | 0.21
6 | 0.41
8 | 0.10
11 | 0.13
db<>fiddle here
第二个和第三个查询return相同的结果
哪个更好?
这将取决于需要多少额外字段 and/or 额外计算。
我正在寻找一种在两个(或更多)不同 table 中查找值时创建相对相关函数的方法。所以我有 table 个这样的
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
我需要通过合并这两个 table 来获得相关函数。相同的行 ID 将获得 10 倍的相关性,ID 仅来自一个 table 的行将获得 "weight" 相关性。
这是我需要得到的中间 table(我的问题是如何制作这样的 table):
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
使用这个table我可以计算任何我需要的相关性,但问题是从这两个创建这样的table。你能帮帮我吗?
我尝试了 LEFT JOIN、STRAIGHT_JOIN、LEFT OUTER JOIN,但它们的结果截然不同。
编辑:如果重要的话,我目前设想最终 table 看起来像这样:
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;
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 |
+----+-----------+
我们可以使用存储过程和临时 tables 来获得解决方案
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
在创建临时 table 的过程中,所有 ID 和权重都来自不同的 table,并根据 ID 获取总和(权重)。
调用存储过程使用
CALL GetReleavance()
您可以根据需要为 table 的数量创建 Union all,它不会对性能产生重大影响。
这里有几个例子:
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 | weight1 | id2 | weight2 -: | ---: | ------: | ---: | ------: 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.10 11 | 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 | relevance -: | --------: 1 | 0.10 2 | 0.15 3 | 0.21 6 | 0.41 8 | 0.10 11 | 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 | relevance -: | --------: 1 | 0.10 2 | 0.15 3 | 0.21 6 | 0.41 8 | 0.10 11 | 0.13
db<>fiddle here
第二个和第三个查询return相同的结果
哪个更好?
这将取决于需要多少额外字段 and/or 额外计算。