2009-11-16 133 views
2

是否可以使用GROUP BY和记录偏好?MySQL GROUP BY优先

比如我有联系的数据一大堆,可能会或可能不会包含所有的信息 - 在一个CSV意义,如果可能是这样的:

Test User, Address1, Address2, [email protected] 
, , , [email protected] 

如果我是GROUP BY电子邮件,我会爱提取更相关的记录。

希望有道理吗?

此致, 克里斯

+0

你是什么意思“更相关的记录”?另一行有相同的电子邮件?或另一列?要么? – Andomar 2009-11-16 12:32:53

+0

嗨,假设这两行上面的数据库在哪里 - 我想拉出与联系信息,而不是与空字段的行。 – ChrisS 2009-11-16 12:44:32

回答

1

您可以使用聚合函数获取每个电子邮件的“相关”记录。
我觉得这个查询会得到你最好的结果:

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 
0

GROUP BY SUBSTRING(字段,N);

0

不知道你的意思,但在一些(?大多数)SQL方言你可以CASE逻辑结合GROUP BY

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