是否可以使用具有记录首选项的GROUP BY?
例如,我有大量的联系人数据,可能包含也可能不包含所有信息 - 在CSV意义上,如果看起来像这样:
Test User, Address1, Address2, test@test.com
, , , test@test.com
如果我是GROUP BY电子邮件,我很乐意提取更相关的记录。
希望有道理吗?
此致, 克里斯
答案 0 :(得分:2)
您可以使用聚合函数为每封电子邮件获取更“相关”的记录。
我认为这个查询会给你最好的结果:
SELECT emailAddress, max(concat(fullName,',',address1,',',address2))
FROM table
GROUP BY emailAddress
它将为每个电子邮件地址返回最丰富的行,但所有数据都将在一个字符串(逗号分隔)中返回,因此您必须以某种方式解析它。
如果性能没有问题,并且您希望在单独的字段中获得正常的结果集,那么您可以选择一个:
SELECT table.emailAddress, fullName, address1, address2
FROM
table JOIN
(SELECT emailAddress,
max(concat(fullName,address1,address2)) as bestRowInOneString
FROM table
GROUP BY emailAddress
) bestRowsSubQuery
ON
concat(table.fullname,table.address1,table.address2) = bestRowsSubQuery.bestRowInOneString
AND table.emailAddress = bestRowsSubQuery.emailAddress
答案 1 :(得分:1)
对于每封电子邮件,此查询将选择设置了最多字段的记录:
SELECT *
FROM (
SELECT DISTINCT email
FROM mytable
) mi
JOIN mytable mo
ON mo.id =
(
SELECT id
FROM mytable mf
WHERE mf.email = mi.email
ORDER BY
username IS NULL + address1 IS NULL + address2 IS NULL DESC
LIMIT 1
)
答案 2 :(得分:0)
GROUP BY SUBSTRING(字段,N);
答案 3 :(得分:0)
不确定您的意思,但在某些(大多数?)SQL方言中,您可以将GROUP BY
与CASE
逻辑结合起来:
GROUP BY case when col1 = 'x' then col1 else col2 end
(就像我说的,我不确定它是否对MySql有效)。
编辑:如果这对MySql无效,你可以随时提取这段逻辑
GROUP BY case when col1 = 'x' then col1 else col2 end
进入视图并从该视图SELECT
,GROUP
包含逻辑的列。
select * from
(
select ....
, (case ....) as logic_col
from ...
) x
group by logic_col