如果我有一个像这样的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的fname
或sname
:
SELECT *
FROM users
GROUP BY email
+-------+-------+------------------+
| fname | sname | email |
+-------+-------+------------------+
| John | | john@smith.com |
| Sue | Jones | sue@jones.com |
| Jim | | jim@jim.com |
+-------+-------+------------------+
有没有办法合并行中的空白字段(类似于COALESCE
时null
与SELECT
一起使用的方式),这会给我以下结果?
+-------+-------+------------------+
| fname | sname | email |
+-------+-------+------------------+
| John | Smith | john@smith.com |
| Sue | Jones | sue@jones.com |
| Jim | | jim@jim.com |
+-------+-------+------------------+
答案 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