【问题标题】:MySQL SELECT / GROUP BY losing NULLsMySQL SELECT / GROUP BY 丢失 NULL
【发布时间】:2018-08-02 16:13:21
【问题描述】:

我有以下两张表:

> 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 |
+-------+-------+-------+

我想要做的是将两张表连接在一起,为t1 中的每个text1,text2 组合获取最小的value

这是我目前的查询,我得到的结果是:

> 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 可能有text1text2 的其他组合,例如('a','z'),我想要在我的结果中,因此我的GROUP BY 子句中同时包含text1text2。至少,这就是我想要的(显然有些东西没有按我的意愿工作)。

注意,我使用的是 MariaDB 版本 10.3.8

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    尝试使用<=> null 安全运算符加入。

    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 不正确,带有空值的行不匹配,因此不会将其纳入结果。

    【讨论】:

      【解决方案2】:

      您不能在此处使用NATURAL JOINUSING()。在 ON 子句中使用 NULL 安全运算符 &lt;=&gt;,它将评估 NULL &lt;=&gt; 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

      【讨论】:

      • 谢谢。不得不把它交给粘性位,因为他在你之前做了扩展的解释。该死的关闭!
      【解决方案3】:

      我认为natural join 是问题

      自然连接是 INNER JOIN 的一种变体,其中连接条件隐含在两个表的公共列上。在您的情况下,Natural Join 中的查询可以编写如下,它不会返回任何结果,因为它会尝试同时匹配 A 和 B

      select *
      from table1
      natural join table2
      

      Inner Join 也可以这样写

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 2016-08-14
        相关资源
        最近更新 更多