Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 如何连接两个表并匹配空值_Mysql_Sql - Fatal编程技术网

Mysql 如何连接两个表并匹配空值

Mysql 如何连接两个表并匹配空值,mysql,sql,Mysql,Sql,我有这些桌子: mysql> select bookId, productId, clusterId, symbolId, shares from SymbolAimOrderStats where bookId = "BFM"; +--------+-----------+-----------+----------+--------+ | bookId | productId | clusterId | symbolId | shares | +--------+-----------

我有这些桌子:

mysql> select bookId, productId, clusterId, symbolId, shares from SymbolAimOrderStats where bookId = "BFM";
+--------+-----------+-----------+----------+--------+
| bookId | productId | clusterId | symbolId | shares |
+--------+-----------+-----------+----------+--------+
| BFM    | NULL      | NULL      | NULL     |    522 |
| BFM    | BFM       | NULL      | NULL     |    522 | 
| BFM    | BFM       | BFM       | NULL     |    522 | 
| BFM    | BFM       | BFM       | 0000f52a |    506 | 
| BFM    | BFM       | BFM       | 00010a4d |      2 | 
| BFM    | BFM       | BFM       | 00010a7c |      1 | 
| BFM    | BFM       | BFM       | 00010a89 |      3 | 
| BFM    | BFM       | BFM       | 00010ba3 |      3 | 
| BFM    | BFM       | BFM       | 00013c7e |      3 | 
| BFM    | BFM       | BFM       | 00013c97 |      4 | 
+--------+-----------+-----------+----------+--------+
10 rows in set (0.00 sec)

mysql> select bookId, productId, clusterId, symbolId, shares from SymbolOrderStats where bookId = "BFM";
+--------+-----------+-----------+----------+--------+
| bookId | productId | clusterId | symbolId | shares |
+--------+-----------+-----------+----------+--------+
| BFM    | NULL      | NULL      | NULL     |    393 | 
| BFM    | BFM       | NULL      | NULL     |    393 | 
| BFM    | BFM       | BFM       | NULL     |    393 | 
| BFM    | BFM       | BFM       | 0000f52a |    377 | 
| BFM    | BFM       | BFM       | 00010a4d |      2 | 
| BFM    | BFM       | BFM       | 00010a7c |      1 | 
| BFM    | BFM       | BFM       | 00010a89 |      3 | 
| BFM    | BFM       | BFM       | 00010ba3 |      3 | 
| BFM    | BFM       | BFM       | 00013c7e |      3 | 
| BFM    | BFM       | BFM       | 00013c97 |      4 | 
+--------+-----------+-----------+----------+--------+
10 rows in set (0.00 sec)
我想联接这些表并从这两个表中获取shares列,包括具有空值的行

我知道你不能匹配空值,所以这当然不能给出我想要的结果:

mysql> select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares 
from SymbolAimOrderStats a 
left join SymbolOrderStats o 
on a.bookId = o.bookId and a.productId = o.productId and 
a.clusterId = o.clusterId and a.symbolId = o.symbolId where a.bookId = "BFM";
所以我试过这个:

mysql> select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares 
from SymbolAimOrderStats a 
left join SymbolOrderStats o 
on a.bookId = o.bookId and 
(a.productId = o.productId or (a.productId is null and o.productId is null)) and 
(a.clusterId = o.clusterId or (a.clusterId is null and o.clusterId is null)) and
(a.symbolId = o.symbolId or (a.symbolId is null or a.symbolId is null)) 
where a.bookId = "BFM";
但这也不能满足我的需求。有人能告诉我怎样才能得到我想要的结果集吗

这是我想要的回报:

+--------+-----------+-----------+----------+--------+--------+
| bookId | productId | clusterId | symbolId | shares | shares |
+--------+-----------+-----------+----------+--------+--------+
| BFM    | NULL      | NULL      | NULL     |    522 |    393 |
| BFM    | BFM       | NULL      | NULL     |    522 |    393 | 
| BFM    | BFM       | BFM       | NULL     |    522 |    393 | 
| BFM    | BFM       | BFM       | 0000f52a |    506 |    377 | 
| BFM    | BFM       | BFM       | 00010a4d |      2 |      2 | 
| BFM    | BFM       | BFM       | 00010a7c |      1 |      1 | 
| BFM    | BFM       | BFM       | 00010a89 |      3 |      3 | 
| BFM    | BFM       | BFM       | 00010ba3 |      3 |      3 | 
| BFM    | BFM       | BFM       | 00013c7e |      3 |      3 | 
| BFM    | BFM       | BFM       | 00013c97 |      4 |      4 | 
+--------+-----------+-----------+----------+--------+--------+
10 rows in set (0.00 sec)

这是在MySQL中。

可能
NULL
值的最后一个条件应该使用
而不是

select a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares 
from SymbolAimOrderStats a 
left join SymbolOrderStats o 
on a.bookId = o.bookId and 
(a.productId = o.productId or (a.productId is null and o.productId is null)) and 
(a.clusterId = o.clusterId or (a.clusterId is null and o.clusterId is null)) and
(a.symbolId = o.symbolId or (a.symbolId is null and o.symbolId is null)) 
------------------------------------------------^ --^
where a.bookId = "BFM";

如果需要有意义的
NULL
,请将其更改为有意义的内容

select  a.bookId, a.productId, a.clusterId, a.symbolId, a.shares, o.shares 
from    SymbolAimOrderStats a 
left join SymbolOrderStats o 
  on    a.bookId = o.bookId
   and ifnull( a.productId, @dummy ) = ifnull( o.productId, @dummy )
   and ifnull( a.clusterId, @dummy ) = ifnull( o.clusterId, @dummy )
   and ifnull( a.symbolId, @dummy ) = ifnull( o.symbolId, @dummy ) 
where a.bookId = "BFM";
其中,
@dummy
是任何值,只要它不与非空值冲突,以消除将
null
与非
null
匹配的可能性,并且是与字段相同的数据类型。如果productId、clusterId和symbolId是不同的类型,则需要三个伪变量。或者您可以在那里硬编码值,但这不是一个好的做法


然而,这就提出了一个问题:如果表中的
NULL
值实际上意味着什么,为什么它们还没有设置为这些值?我并不想批评——可能有完全合理的理由让它们保持
NULL
。但是,您可能忽略了改进数据的机会。

您还没有向我们展示您的需求。请发布期望的结果。对不起,我认为这是清楚的。我已经用这些信息更新了我的问题。而且它应该是o.symbol,在和你们两个-2个愚蠢的打字错误之后。数据是通过使用汇总选择的查询创建的。空值是所有符号、簇和符号或产品、簇和符号的集合。是的,创建数据的代码可以将空值更改为其他内容,但是有很多现有代码期望空值指示聚合。