当GROUPing BY时,MySQL会压缩空字段

时间:2016-09-13 16:05:46

标签: mysql

如果我有一个像这样的MySQL表,其中有两行用于特定的电子邮件地址,每个都不完整,但一起制作完整的记录:

+-------+-------+------------------+
| fname | sname | email            |
+-------+-------+------------------+
| John  |       | john@smith.com   |
|       | Smith | john@smith.com   |
| Sue   | Jones | sue@jones.com    |
| Jim   |       | jim@jim.com      |
+-------+-------+------------------+

我可以使用GROUP BY运行以下查询以返回不同的电子邮件地址,并接收John Smith的fnamesname

SELECT *
FROM users
GROUP BY email

+-------+-------+------------------+
| fname | sname | email            |
+-------+-------+------------------+
| John  |       | john@smith.com   |
| Sue   | Jones | sue@jones.com    |
| Jim   |       | jim@jim.com      |
+-------+-------+------------------+

有没有办法合并行中的空白字段(类似于COALESCEnullSELECT一起使用的方式),这会给我以下结果?

+-------+-------+------------------+
| fname | sname | email            |
+-------+-------+------------------+
| John  | Smith | john@smith.com   |
| Sue   | Jones | sue@jones.com    |
| Jim   |       | jim@jim.com      |
+-------+-------+------------------+

2 个答案:

答案 0 :(得分:1)

使用max()获取每封电子邮件的“最高”值

SELECT email, 
       max(fname) as fname, 
       max(sname) as sname
FROM users
GROUP BY email

答案 1 :(得分:1)

您可以使用max()聚合函数返回组的最高非空值。您应该将它用于两个列(无论如何,您当前的sql查询都是针对sql标准的,因为您在选择列表中的字段既不在group by列表中,也不是聚合函数的主题):

SELECT email, max(fname) as fname, max(sname) as sname
FROM users
GROUP BY email