mysql通过丢失空值来选择/分组

6xfqseft  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(247)

我有以下两张table:

> select * from t1;
+-------+-------+
| text1 | text2 |
+-------+-------+
| a     | NULL  |
| b     | c     |
| d     | e     |
+-------+-------+

> select * from t2;
+-------+-------+-------+
| text1 | text2 | value |
+-------+-------+-------+
| a     | NULL  |     1 |
| a     | NULL  |     2 |
| a     | NULL  |     3 |
| b     | c     |     1 |
| b     | c     |     2 |
| d     | e     |     3 |
| f     | g     |     1 |
+-------+-------+-------+

我要做的是把两个表连接在一起,抓住最小值 value 对于每个 text1,text2 组合中的 t1 .
以下是我到目前为止的查询结果:

> select text1, text2, min(value)
> from t1
> natural join t2
> group by text1, text2
> order by text1 asc;
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| b     | c     |          1 |
| d     | e     |          3 |
+-------+-------+------------+

所以这几乎是我需要的,但正如你所看到的,我失去了 a 值,因为 text2NULL . 以下是我期待的结果:

+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| a     | NULL  |          1 |
| b     | c     |          1 |
| d     | e     |          3 |
+-------+-------+------------+

那么,我的查询过滤掉那些 NULL 价值观?
请注意 t2 可能有其他的 text1 以及 text2 ,例如。 ('a','z') ,我不想在我的结果,因此我有两个 text1 以及 text2 在我的 GROUP BY 条款。至少,这正是我想要的(显然有些东西没有像我希望的那样工作)。
注意,我使用的是mariadb版本10.3.8

bttbmeg0

bttbmeg01#

你不能使用 NATURAL JOIN 或者 USING() 在这里。使用空安全运算符 <=> 在on子句中,哪个将 NULL <=> NULL1 ,而 NULL = NULLNULL :

select t1.text1, t1.text2, min(value)
from t1
join t2
  on  t2.text1 = t1.text1
  and t2.text2 <=> t1.text2
group by t1.text1, t1.text2
order by t1.text1 asc;

演示:http://sqlfiddle.com/#!9/3ca2a1/1号

czfnxgou

czfnxgou2#

试着加入 <=> 空安全运算符。

SELECT t1.text1,
       t1.text2,
       min(t2.value)
       FROM t1
            INNER JOIN t2
                       ON t2.text1 <=> t1.text1
                          AND t2.text2 <=> t1.text2
       GROUP BY t1.text1,
                t1.text2
       ORDER BY t1.text1 ASC;

你现在所拥有的可以转化为:

SELECT t1.text1,
       t1.text2,
       min(t2.value)
       FROM t1
            INNER JOIN t2
                       ON t2.text1 = t1.text1
                          AND t2.text2 = t1.text2
       GROUP BY t1.text1,
                t1.text2
       ORDER BY t1.text1 ASC;

作为 NULL = NULL 不是真的空的行不匹配,因此不进入结果。

dsf9zpds

dsf9zpds3#

我想 natural join 问题出在哪里
自然联接是内部联接的一个变体,其中联接条件隐式地存在于两个表的公共列上。在您的例子中,自然连接中的查询可以如下所示,它不会返回任何结果,因为它将尝试同时匹配a和b

select *
from table1
natural join table2

在内部连接中也可以这样写,如下所示

select t1.*
from table1 t1
inner join table2 t2
on t1.text1 = t2.text1 and t1.text2 = t2.text2

相关问题